循环遍历并复制键值对
举个例子,我有两个文本文件,内容如下:
文件 1
"key_one" = "这是键一的字符串值"
"key_two" = "这是键二的字符串值"
// 注释 //
"key_three" = "这是键三的字符串值"
文件 2
// 注释
"key_one" = "key_one"
// 注释
"key_two" = "key_two"
现在,我想遍历文件 1,提取每个键和字符串值(如果不是注释行的话)。然后,我想在文件 2中查找这个键,如果找到了,就用文件 1中的字符串值替换掉它的字符串值。
我觉得用一些正则表达式(regex)会很有用,但这就是我计划的难点。我对正则表达式的理解还不够好,虽然我在慢慢进步。
这是我想出来的用来匹配键的正则表达式:"^\"\w*\""
,还有这是我试图匹配字符串的正则表达式:"= [\"a-zA-Z0-9 ]*"
这些可能不太对或者不是最好的,所以欢迎纠正我。
我想用bash脚本或者python脚本来完成这个任务。我在python中尝试使用正则表达式的搜索和匹配功能,但效果不太好。
4 个回答
下面的代码是用来处理文本文件的,主要分成几个部分来讲:
import pprint
这个函数叫做get_values,它的作用是从一个文件中读取内容。首先,它打开一个文件(这里是f),然后把文件里的每一行都读出来,放到一个叫file1的列表里。接着,它创建了一个空的字典(类似于一个可以存储键值对的容器),叫做values。
接下来,代码会逐行检查file1里的内容。如果这一行不是以“//”开头(也就是不是注释),并且包含“=”这个符号,那么它就会把这一行按“=”分成两部分,前面是key(键),后面是value(值)。然后,它把这个键值对存到values字典里。
return values
这个函数叫做replace_values,它的作用是用一个字典里的值去替换另一个字典里的值。它会遍历第一个字典v1里的每一个键,如果这个键也在第二个字典v2里,那么就把v1里对应的值替换到v2里。
接下来,代码调用get_values函数,分别从“file1.txt”和“file2.txt”这两个文件中获取值,存到file1_values和file2_values这两个字典里。
然后,代码会打印出“BEFORE”,显示在替换之前file1_values和file2_values的内容。
接着,它调用replace_values函数,把file1_values里的值替换到file2_values里。
最后,代码会打印出“AFTER”,显示在替换之后file1_values和file2_values的内容。
如果这些文本文件的格式是比较固定的,那么可以用这种方式来处理。
上面的代码会完成你想要的操作,并且会输出替换后的结果:
BEFORE {'"key_one" ': ' "String value for key one"\n', '"key_three" ': ' "String value for key two"', '"key_two" ': ' "String value for key two"\n'} {'"key_one" ': ' "key_one"\n', '"key_two" ': ' "key_two"'} AFTER {'"key_one" ': ' "String value for key one"\n', '"key_three" ': ' "String value for key two"', '"key_two" ': ' "String value for key two"\n'} {'"key_one" ': ' "String value for key one"\n', '"key_two" ': ' "String value for key two"\n'}
我听过一句话:“如果你有一个问题,并试图用正则表达式来解决它,那你现在就有两个问题。”
其实你想要实现的功能,可以用Python自带的一些简单字符串方法来轻松完成,比如 startswith()
和 split()
,根本不需要用到正则表达式。
简单来说,你可以这样做:
For each line of File 1
Check if it's a comment line by checking that it starts with '//'
If not a comment line, split it to `key` and `value`
Store the key/value in a dictionary
For each line of File 2
Check if it's a comment line by checking that it starts with '//'
If not a comment line, split it to `key` and `value`
Check the dictionary to see if the key exists
Output to the file as necessary
你可以从FILE1
创建一个字典,然后用这个字典里的值去替换FILE2
中的内容。
import fileinput
import re
pattern = re.compile(r'"(.*?)"\s+=\s+"(.*?)"')
with open('FILE1', 'r') as f:
values = dict(pattern.findall(f.read()))
for line in fileinput.input('FILE2', inplace=True):
match = pattern.match(line)
if match:
line = '"%s" = "%s"' % (match.group(1), values[match.group(1)])
print line.strip()
根据这里的一些建议,我自己写了一个解决方案。虽然这个方案可能在某些地方还可以改进,但我为自己能独立完成这个解决方案而感到高兴,而不是简单地复制别人的答案。所以,这是我的解决方案:
import fileinput
translations = {}
with open('file1.txt', 'r') as fileOne:
trans = fileOne.readlines()
for line in trans:
if (line.startswith("\"")):
key, value = line.strip().split(" = ")
translations[key] = value
for line in fileinput.input('file2.txt', inplace=True):
if (line.startswith("\"")):
key, value = line.strip().split(" = ")
if key in translations:
line = "{} = {}".format(key, translations[key])
print line.strip()
如果可以的话,我还是会给一些有用的答案点赞。