我有一个巨大的文本文件,其中包含多行行。我想按顺序读取文件,并且每当我找到字符串时,在任何行中都假定为“ Apple”
我想替换整行,而不仅仅是字符串“ Apple”。
注意:“ Apple”只是一行中包含多个其他字符的字符串。 将行替换为“我们在这家商店不再出售苹果”。
我读到file.readlines()
不能读取大量文件。因此,请给我指导,我如何不使用readlines
来实现这一目标。
答案 0 :(得分:1)
一种非常直接的方法是将所做的更改写入第二个文件,然后覆盖第一个文件。
with open(input_file, 'r') as ifile:
with open(output_file, 'w') as ofile:
for line in ifile:
if 'Apple' in line:
ofile.write('some other content')
else:
ofile.write(line)
然后删除输入文件并重命名输出文件
另一种方法是使用r +标志打开文件,并使用file.seek()在文件中四处移动。这样的东西(我还没有测试过):
pos = 0
with open(filename, 'r+') as fi:
while True:
line = fi.readline()
if line == '':
break
if 'Apple' in line:
fi.seek(pos) # Return to beginning of the read-in line
fi.write(line.replace("Apple", "Orange")) # Write new line
fi.seek(pos) # Return to the beginning of the written line
line = fi.readline() # Read to the end of the line
pos = fi.tell() # Fetch new position in the file
但是,这不明智,因为它容易出错。每次重写一行时,您都在改变下一行的开始位置,所以我写的内容可能甚至无法正常工作(如果替换时间超过了下一行,您有时可能会覆盖下一行的一部分)原本的)。
如果文件较小,则应将整个内容读取到内存中;如果文件较大,则应使用临时文件。