2

我有一个 100mb 的大文件,我想对其执行大约 5000 次字符串替换,实现这一目标的最有效方法是什么?

没有比逐行读取文件并在每行上执行 5000 次替换更好的方法吗?

在打开文件并对字符串执行 5000 次替换时,我还尝试使用 .read 方法将文件作为字符串读取,但这甚至更慢,因为它会复制整个文件的 5000 个副本。

该脚本必须使用 python 2.6 在 Windows 上运行

提前致谢

4

3 回答 3

2

按此顺序尝试以下操作,直到获得足够快的操作。

  1. 将文件读入一个大字符串并依次进行每次替换,覆盖相同的变量。

    with open(..., 'w') as f:
        s = f.read()
        for src, dest in replacements:
            s = s.replace(src, dest)
        f.seek(0)
        f.write(s)
    
  2. 内存映射文件,并编写一个自定义替换函数来进行替换。

于 2012-06-21T20:31:28.217 回答
2

我建议,不要进行 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)
于 2012-06-21T22:06:05.230 回答
0

您应该使用 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()
于 2012-06-21T20:22:02.267 回答