循环遍历并复制键值对

0 投票
4 回答
994 浏览
提问于 2025-04-18 16:49

举个例子,我有两个文本文件,内容如下:

文件 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 个回答

0

下面的代码是用来处理文本文件的,主要分成几个部分来讲:

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'}
    

1

我听过一句话:“如果你有一个问题,并试图用正则表达式来解决它,那你现在就有两个问题。”

其实你想要实现的功能,可以用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
1

你可以从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()
-1

根据这里的一些建议,我自己写了一个解决方案。虽然这个方案可能在某些地方还可以改进,但我为自己能独立完成这个解决方案而感到高兴,而不是简单地复制别人的答案。所以,这是我的解决方案:

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()

如果可以的话,我还是会给一些有用的答案点赞。

撰写回答