首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python替换大文件中的任意行

python替换大文件中的任意行
EN

Stack Overflow用户
提问于 2013-04-25 06:41:16
回答 1查看 584关注 0票数 0

假设我有一个很大的文件,我想替换第n行。我知道这个解决方案:

代码语言:javascript
复制
w = open('out','w')
for line in open('in','r'):
    w.write(replace_somehow(line))

os.remove('in')
os.rename('out','in')

我不想用很多行重写整个文件,如果要替换文件开头的行的话。有没有可能直接替换第n行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-25 06:42:50

除非保证新行与原始行的长度完全相同,否则没有办法重写整个文件。

一些文字处理程序通过存储更改日志,或在每个块的末尾有额外空间的大块列表,或较小块的数据库,从而使自动保存修改可以快速完成(只需附加到日志,或重写单个块,或执行数据库更新),但真正的“保存”按钮将重建整个文件,并一次性写入所有文件。

如果自动保存的次数比用户手动保存的次数多得多,并且文件非常大,那么这样做是值得的。(请记住,在设计Microsoft Word时,100KB的…非常大)

这就指向了正确的答案。如果您有5 5GB的数据,并且需要更改其中的第N条记录,则不应该使用定义为没有索引的可变长度记录序列的格式。这就是文本文件的含义。对于您的情况来说,最简单的格式是一系列固定大小的记录-但如果您需要插入或删除记录以及就地更改它们,它将与文本文件一样糟糕。因此,首先考虑您的需求,然后选择一个数据结构。

如果您需要处理一些更有限的格式(如文本文件),以便与其他程序进行交换,这是很好的。在所有更改之后,您将不得不重写整个文件一次,以“导出”,但您不必每次进行任何更改时都这样做。

如果所有行的长度都完全相同,则可以执行以下操作:

代码语言:javascript
复制
with open('myfile.txt', 'rb+') as f:
    f.seek(FIXED_LINE_LENGTH * line_number)
    f.write(new_line)

请注意,重要的是字节长度,而不是字符长度。而且您必须以二进制模式打开该文件才能以这种方式使用它。

如果你不知道你要替换的行号,你会想要这样:

代码语言:javascript
复制
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)

如果您不要求所有行的长度都相同,但您可以绝对肯定这一行新行的长度与旧行的长度相同,您可以这样做:

代码语言:javascript
复制
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()
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16203452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档