2015-10-20 37 views
0

我发现了一行代码,搜索,如果它出现在文本上这个答案替换字符串:Python的outFile.writelines - 只有第一线工作

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

什么是'searchFile'?我们可以看到定义吗? –

回答

0

我打算猜到searchFile文件(您使用open调用创建的),而不是列表。

File对象有一个内部的指针指向自己的当前位置。当你从文件中获得某个东西时,内部指针会被更新 - 因此将来调用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) 

您应该选择第一个选项,如果你希望能够迅速关闭输入文件的文件过大,完全读入内存,而第二个选项。