我有一个 100mb 的大文件,我想对其执行大约 5000 次字符串替换,实现这一目标的最有效方法是什么?
没有比逐行读取文件并在每行上执行 5000 次替换更好的方法吗?
在打开文件并对字符串执行 5000 次替换时,我还尝试使用 .read 方法将文件作为字符串读取,但这甚至更慢,因为它会复制整个文件的 5000 个副本。
该脚本必须使用 python 2.6 在 Windows 上运行
提前致谢
按此顺序尝试以下操作,直到获得足够快的操作。
将文件读入一个大字符串并依次进行每次替换,覆盖相同的变量。
with open(..., 'w') as f:
s = f.read()
for src, dest in replacements:
s = s.replace(src, dest)
f.seek(0)
f.write(s)
内存映射文件,并编写一个自定义替换函数来进行替换。
我建议,不要进行 5000 次搜索,而是一次搜索 5000 项:
import re
replacements = {
"Abc-2454": "Gb-43",
"This": "that",
"you": "me"
}
pat = re.compile('(' + '|'.join(re.escape(key) for key in replacements.iterkeys()) + ')')
repl = lambda match: replacements[match.group(0)]
您现在可以将 re.sub 应用于整个文件,
with open("input.txt") as inf:
s = inf.read()
s = pat.sub(repl, s)
with open("result.txt") as outf:
outf.write(s)
或逐行,
with open("input.txt") as inf, open("result.txt") as outf:
outf.writelines(pat.sub(repl, line) for line in inf)
您应该使用 open() 和 read() 读入文本,然后使用(编译的)正则表达式进行字符串替换。一个简短的例子:
import re
# read data
f = open("file.txt", "r")
txt = f.read()
f.close()
# list of patterns and what to replace them with
xs = [("foo","bar"), ("baz","foo")]
# do replacements
for (x,y) in xs:
regexp = re.compile(x)
txt = regexp.sub(y, txt)
# write back data
f = open("file.txt", "w")
f.write(txt)
f.close()