我找到了一行代码,如果它出现在这个答案的文本中,它会搜索并替换字符串:
Search for a line that contains some text, replace complete line python
outFile.writelines("process.control.timeout=900\n"
if "process.control.timeout" in line else line
for line in process)
我对它进行了修改并连续使用了三次,如下所示:
def runSearch(self):
outFile.writelines("aFile=" + aFilename + "\n" if "aFile=" in line else line for line in searchFile)
outFile.writelines("bFile=" + bFilename + "\n" if "bFile=" in line else line for line in searchFile)
outFile.writelines("cFile=" + cFilename + "\n" if "cFile=" in line else line for line in searchFile)
问题是,唯一可行的是第一行。为什么这样,我该如何解决?
答案 0 :(得分:0)
我猜测searchFile
是文件(您通过调用open
创建的),而不是列表。
文件对象具有指向其当前位置的内部指针。当您read
来自文件时,内部指针会更新 - 因此将来调用read
将不会返回相同的结果。
迭代文件中的行,就像在此处(line for line in searchFile
)一样,是更改文件当前位置的另一个操作示例。您可以考虑将文件重复多次调用read
。
因此,一旦您遍历文件中的所有行,就已经到了最后,文件中的后续read
将不会返回任何内容。您可以在使用tell
迭代后获取文件的当前位置来测试这一点:
print(searchFile.tell()) # will be 0
outFile.writelines("aFile=" + aFilename + "\n" if "aFile=" in line else line for line in searchFile)
print(searchFile.tell()) # will be some large number of bytes
有两种方法可以解决这个问题。在您阅读之后,一个选项是reset the file's position为0。
outFile.writelines("aFile=" + aFilename + "\n" if "aFile=" in line else line for line in searchFile)
searchFile.seek(0)
outFile.writelines("bFile=" + bFilename + "\n" if "bFile=" in line else line for line in searchFile)
searchFile.seek(0)
outFile.writelines("cFile=" + cFilename + "\n" if "cFile=" in line else line for line in searchFile)
searchFile.seek(0)
另一种选择是读取文件一次并将内容存储在列表中。
lines = searchFile.readlines()
outFile.writelines("aFile=" + aFilename + "\n" if "aFile=" in line else line for line in lines)
outFile.writelines("bFile=" + bFilename + "\n" if "bFile=" in line else line for line in lines)
outFile.writelines("cFile=" + cFilename + "\n" if "cFile=" in line else line for line in lines)
如果您的文件太大而无法完全读入内存,则应选择第一个选项;如果您希望能够快速关闭输入文件,则应选择第二个选项。