我有三个python列表:
列表总是长度相同且顺序正确。
我需要在filePaths中打开每个文件,在textToFind中找到该行,并用textToReplace替换该行。我有填充列表的所有代码。我坚持要做替换。我试过了:
for line in fileinput.input(filePath[i], inplace=1):
sys.stdout.write(line.replace(find[i], replace[i]))
如何迭代每个文件以在与find匹配的每一行上进行文本替换?
答案 0 :(得分:0)
我可能会在没有更多信息的情况下做这样的事情
for my_file in file_paths:
with open(my_file, 'r') as cin, open(my_file, 'w') as cout:
lines = cin.readlines() #store the file in mem so i can overwrite it.
for line in lines:
line = line.replace(find, replace) # change as needed
cout.write(line)
迭代所有文件路径,打开文件进行读取,然后单独写入文件。将文件行存储在变量中,如下所示,我将覆盖原始文件。做你的替换,记住是否有什么可以替换python只留下线。将该行写回文件。
答案 1 :(得分:0)
您可以将文件读取到某个临时变量,进行更改,然后将其写回:
with open('file', 'r') as f:
text = f.read()
with open('file', 'w') as f:
f.write(text.replace('aaa', 'bbb'))
答案 2 :(得分:0)
当您需要在迭代序列时使用序列中项目的索引时,请使用enumerate。
for i, path in enumerate(filePath):
for line in fileinput.input(path, inplace=1):
sys.stdout.write(line.replace(find[i], replace[i]))
另一种选择是使用zip,它会按顺序为每个序列提供一个项目。
for path, find_text, replace_text in zip(filePath, textToFind, textToReplace):
for line in fileinput.input(path, inplace=1):
sys.stdout.write(line.replace(find_text, replace_text))
请注意,对于Python 2.x zip
将生成一个可以迭代的新列表 - 所以如果你正在压缩的序列很大,它将消耗内存。 Python 3.x zip
生成一个迭代器,因此它不具备该功能。
使用普通文件对象,您可以将整个文件读入变量,并立即对整个文件执行字符串替换。