python中的键替换

时间:2017-08-18 16:32:44

标签: python

我有两个文本文件,一个我们会调用keys,它看起来像这样:

S-84
S-72
S-73
S-83
32
S-73
S-83
32
S-65
32
S-84
S-69
S-83
S-84
S-49

另一个文件是键值对的字典:

S-49 : "!"
S-65 : "a"
S-66 : "b"
S-67 : "c"
S-68 : "d"
S-69 : "e"
S-70 : "f"
S-71 : "g"
S-72 : "h"
S-73 : "i"
S-74 : "j"
S-75 : "k"
S-76 : "l"
S-77 : "m"
S-78 : "n"
S-79 : "o"
S-80 : "p"
S-81 : "q"
S-82 : "r"
S-83 : "s"
S-84 : "t"
S-85 : "u"
S-86 : "v"
S-87 : "w"
S-88 : "x"
S-89 : "y"
S-90 : "z"
32 : " "

我想在第一个文件中读取并将其中的键替换为第二个文件中的值,以便输出文件如下所示:

this is a test!

我真的不知道从哪里开始。 我试图手动开始这样的事情,但我的输出是bleh

with open('newkey.log', 'r') as input_file, open('newkey.txt', 'w') as output_file:
    for line in input_file:
        if line.strip() == 'S-84':
            output_file.write('t\n')
        else:
            output_file.write('bleh\n')

我想我必须将第二个文件作为字典读入,或者我可以对其进行硬编码?我宁愿最终能够在解释器之外更改该文件。

2 个答案:

答案 0 :(得分:0)

是的,您必须先读入第二个文件才能创建字典。

import re

d['S-186'] = ':'  # To account for the delimiter per your comments below.
with open(key_values_filename, 'r') as f:
    for row in f:
        k, v = row.split(':')
        d[k.strip()] = re.sub('^"|"$', '', v.strip())

然后读取另一个文件并从匹配的密钥中获取值。

missing_value = 'key missing'
with open(keys_filename, 'r') as fin, open(result_filename, 'w') as fout:
    for row in fin:
        fout.write(d.get(row.strip(), missing_value))

对于正则表达式re.sub('^"|"$', '', v.strip())的解释,它删除在每个被删除的空格的解析字符串的开头或结尾处找到的双引号。

  • ^"在字符串的 start 处断言引号的位置。
  • "$在字符串的 end 处断言引号的位置。
  • |匹配上面的断言。

以上解决方案适用于您的样本数据。

答案 1 :(得分:0)

你可以试试这个:

import re

keys = {a:b for a, b in [re.split("\s:\s", i.strip('\n')) for i in open('second_file.txt')]}

final_message = ''.join(keys[i] for i in [b.strip('\n') for b in open('first_file.txt')])