假设我有一个很大的文件,我想替换第n行。我知道这个解决方案:
w = open('out','w')
for line in open('in','r'):
w.write(replace_somehow(line))
os.remove('in')
os.rename('out','in')我不想用很多行重写整个文件,如果要替换文件开头的行的话。有没有可能直接替换第n行?
发布于 2013-04-25 06:42:50
除非保证新行与原始行的长度完全相同,否则没有办法重写整个文件。
一些文字处理程序通过存储更改日志,或在每个块的末尾有额外空间的大块列表,或较小块的数据库,从而使自动保存修改可以快速完成(只需附加到日志,或重写单个块,或执行数据库更新),但真正的“保存”按钮将重建整个文件,并一次性写入所有文件。
如果自动保存的次数比用户手动保存的次数多得多,并且文件非常大,那么这样做是值得的。(请记住,在设计Microsoft Word时,100KB的…非常大)
这就指向了正确的答案。如果您有5 5GB的数据,并且需要更改其中的第N条记录,则不应该使用定义为没有索引的可变长度记录序列的格式。这就是文本文件的含义。对于您的情况来说,最简单的格式是一系列固定大小的记录-但如果您需要插入或删除记录以及就地更改它们,它将与文本文件一样糟糕。因此,首先考虑您的需求,然后选择一个数据结构。
如果您需要处理一些更有限的格式(如文本文件),以便与其他程序进行交换,这是很好的。在所有更改之后,您将不得不重写整个文件一次,以“导出”,但您不必每次进行任何更改时都这样做。
如果所有行的长度都完全相同,则可以执行以下操作:
with open('myfile.txt', 'rb+') as f:
f.seek(FIXED_LINE_LENGTH * line_number)
f.write(new_line)请注意,重要的是字节长度,而不是字符长度。而且您必须以二进制模式打开该文件才能以这种方式使用它。
如果你不知道你要替换的行号,你会想要这样:
with open('myfile.txt', 'rb+') as f:
for line_number, line in enumerate(f):
if is_the_right_line(line):
f.seek(FIXED_LINE_LENGTH * line_number)
f.write(new_line)如果您不要求所有行的长度都相同,但您可以绝对肯定这一行新行的长度与旧行的长度相同,您可以这样做:
with open('myfile.txt', 'rb+') as f:
last_pos = 0
for line_number, line in enumerate(f):
if is_the_right_line(line):
f.seek(last_pos)
f.write(new_line)
last_pos = f.tell()https://stackoverflow.com/questions/16203452
复制相似问题