在我正在编写的Python函数中,我将逐行浏览一个文本文件,用一个(数值)值替换某个字符串的每个出现。一旦我在文件的末尾,我想知道该字符串是否出现在文件中。
函数string.replace()不会告诉你是否有任何替换,所以我发现自己必须重复每一行两次,寻找字符串并再次替换字符串。
到目前为止,我已经提出了两种方法来实现这一目标。
line.find(...)
查找字符串(如果在newLine = line.replace(...)
newLine
...)newLine = line.replace(...)
newLine != line
将字符串标记为找到newLine
...)这是我的问题: 是否有更好的,即更有效或更pythonic的方式来做到这一点? 如果没有,上述哪种方式更快?
答案 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')