Python outFile.writelines - 只有第一行有效

时间:2015-10-20 14:06:34

标签: python

我找到了一行代码,如果它出现在这个答案的文本中,它会搜索并替换字符串:

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)

问题是,唯一可行的是第一行。为什么这样,我该如何解决?

1 个答案:

答案 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)

如果您的文件太大而无法完全读入内存,则应选择第一个选项;如果您希望能够快速关闭输入文件,则应选择第二个选项。