【问题标题】:Python : Text Replacement In Large FilesPython:大文件中的文本替换
【发布时间】:2013-05-26 20:33:00
【问题描述】:

我正在尝试在文本文件中非常特定的位置插入文本。此文本文件可能相当大(>> 10 GB)

我目前使用的阅读方法:

with open("my_text_file.txt") as f:
   while True:
     result = f.read(set_number_of_bytes)
     x = process_result(result)
     if x:
       replace_some_characters_that_i_just_read_and write_it_back_to_same_file

但是,我不确定如何实现

replace_some_characters_that_i_just_read_and write_it_back_to_same_file

是否有一些方法可以用来确定我在当前文件中读取的位置,我可以用来写入文件。

性能方面,如果我要使用上述方法在特定位置写入原始文件,在写入之前必须找到写入位置会不会存在效率问题?

或者您会建议创建一个完全不同的文件并在上面的每个循环中附加到该文件。那么这个操作完成后删除原文件呢?假设空间不是一个大问题,但性能是。

【问题讨论】:

  • 您替换的文本长度是否与原始文本完全相同?如果没有,那么您别无选择,需要创建一个新文件。
  • 并非所有文本都与原始文本相同。每次写入(循环的每次迭代)时,fileinput 模块是否在内部创建一个新文件? (如下所述)
  • @user1431282:在我的回答中展开;该文件被移到一边,然后您编写一个完整的新文件,并根据需要更改原始数据。

标签: python


【解决方案1】:

使用fileinput module,在替换数据时正确处理文件,并设置inplace标志:

import sys
import fileinput

for line in fileinput.input('my_text_file.txt', inplace=True):
    x = process_result(line)
    if x:
        line = line.replace('something', x)

    sys.stdout.write(line)

当您使用inplace 标志时,原始文件将移动到备份中,并且您写入sys.stdout 的任何内容都会写入原始文件名(因此,作为新文件)。确保包含所有行,无论是否更改。

必须在您的替换数据与您要替换的部分的字节数不完全相同时重写整个文件。

【讨论】:

    猜你喜欢
    • 2011-09-06
    • 2011-02-26
    • 1970-01-01
    • 2017-03-30
    • 2014-03-04
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    相关资源
    最近更新 更多