在Python中,如何有效地检查文件中是否找到了字符串?

时间:2014-07-02 13:16:33

标签: python string performance replace

在我正在编写的Python函数中,我将逐行浏览一个文本文件,用一个(数值)值替换某个字符串的每个出现。一旦我在文件的末尾,我想知道该字符串是否出现在文件中。

函数string.replace()不会告诉你是否有任何替换,所以我发现自己必须重复每一行两次,寻找字符串并再次替换字符串。

到目前为止,我已经提出了两种方法来实现这一目标。

  1. 每行:
    • 使用line.find(...)查找字符串(如果在
    • 之前未找到)
    • 如果找到该字符串,请将其标记为找到
    • newLine = line.replace(...)
    • (做某事newLine ...)
  2. 每行:
    • newLine = line.replace(...)
    • 如果newLine != line将字符串标记为找到
    • (做某事newLine ...)
  3. 这是我的问题: 是否有更好的,即更有效或更pythonic的方式来做到这一点? 如果没有,上述哪种方式更快?

3 个答案:

答案 0 :(得分:0)

我做的事情大致像是

found = False
newlines = []

for line in f:
    if oldstring in line:
        found = True
        newlines.append(line.replace(oldstring, newstring))
    else:
        newlines.append(line)

因为这对我来说是最容易理解的,我想。

可能有更快的方法,但最好的方法取决于字符串在行中出现的频率。几乎每一行或几乎没有线,这都有很大的不同。

答案 1 :(得分:0)

此示例适用于多个替换:

replacements = {'string': [1,0], 'string2': [2,0]}

with open('somefile.txt') as f:
    for line in f:
        for key, value in replacements.iteritems():
            if key in line:
                new_line = line.replace(key, value[0])
                replacements[key][1] += 1

# At the end

for key, value in replacements.iteritems():
    print('Replaced {} with {} {} times'.format(key, *value))

答案 2 :(得分:0)

由于我们无论如何都必须经历两次字符串,所以我要按如下方式进行:

import re
with open('yourfile.txt', 'r', encoding='utf-8') as f:  # check encoding
    s = f.read()
oldstr, newstr = 'XXX', 'YYY'
count = len(list(re.finditer(oldstr, s)))
s_new = s.replace(oldstr, newstr)
print(oldstr, 'has been found and replaced by', newstr, count, 'times')