我有一个遍历文本文件的功能,将单词与字典中的键匹配,并将这些单词更改为键值:
def replace_operators(text):
operators = {'order': '"order"'}
f = open(text, 'r').read()
for k, v in operators.items():
cleaned = re.sub(r"\b%s\b" % k, v, f)
f = open(text, 'w')
f.truncate(0)
f.close()
text_file = open(text, 'w')
text_file.write(cleaned)
text_file.close()
这很好,但是当我在字典中添加另一个键时,会收到:
TypeError:预期的字符串或类似字节的对象
我已经尝试了在清除的行中用str(f)替换f的解决方案(由this建议),但这仅将以下行写入我的输出文件:
<_ io.TextIOWrapper“名称” ='路径/文件/输出文件'模式='w'编码='cp1252'>
有人知道我如何添加更多密钥而不出现这种错误吗?
答案 0 :(得分:1)
您不需要为此循环,也无需多次替换和写入文件。一种非常有效的方法是:
像这样:
import re
text = "input.txt"
operators = {'order': '"order"', 'matter':'"matter"'}
with open(text, 'r') as f:
contents = f.read()
cleaned = re.sub(r"\b(\w+)\b",lambda m : operators.get(m.group(1),m.group(1)),contents)
with open("new_"+text, 'w') as f:
f.write(cleaned)
这个鲜为人知的功能非常强大。它允许传递 function 作为替换(不是字符串)。此函数将匹配项作为输入,并返回必须替换匹配项的字符串作为输出。我的函数是一个匿名函数(lambda):
lambda m : operators.get(m.group(1),m.group(1))
因此,如果匹配的单词在词典中,它将返回并替换为值,否则将返回原始单词。
所有这些都无需循环和O(1)
单词查找,即使您的字典中有很多个项目,它也非常快(与线性nth替换方法或构建列表相反)带有"|".join()
的关键字,当您有1000多个要搜索/替换的项目时,该关键字开始抓取)