PythonoutFile.writelines文件只有一线工作

2024-10-01 22:25:23 发布

您现在位置: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)

问题是,只有第一行行行得通。为什么会这样?我该怎么解决?你知道吗


Tags: 字符串inforwritelinesiflinetimeoutprocess
1条回答
网友
1楼 · 发布于 2024-10-01 22:25:23

我猜searchFile是一个文件(通过调用open创建的),而不是一个列表。你知道吗

文件对象有一个指向其当前位置的内部指针。当您从文件中read某个内容时,内部指针会被更新—因此将来对read的调用将不会返回相同的结果。你知道吗

重复文件中的行,就像您在这里所做的(line for line in searchFile)是更改文件中当前位置的另一个操作示例。你可以把迭代一个文件看作是在幕后多次调用read。你知道吗

因此,一旦遍历了文件中的所有行,就到达了末尾,文件中随后的read将不会返回任何内容。您可以通过在使用^{}进行迭代之后获取文件的当前位置来测试这一点:

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)

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

相关问题 更多 >

    热门问题