【问题标题】:How to efficiently append a new line to the starting of a large file?如何有效地将新行附加到大文件的开头?
【发布时间】:2012-07-23 15:46:15
【问题描述】:

我想在 2GB+ 文件的开头添加一个新行。我尝试了以下代码,但代码 OUT of MEMORY 错误。

myfile = open(tableTempFile, "r+")
myfile.read() # read everything in the file
myfile.seek(0) # rewind
myfile.write("WRITE IN THE FIRST LINE ")
myfile.close();
  1. 在不将整个文件放入内存的情况下写入文件文件的方法是什么?
  2. 如何在文件开头追加新行?

【问题讨论】:

  • 如果您需要阅读文件,为什么不逐行阅读?
  • 另外我建议使用with 块,它更好,并且会在块退出时自动关闭您的文件。
  • 我真的不需要阅读文件,只是认为有必要为了倒带它。 Python新手..
  • 请注意,如果第一行比您写入的内容短,您将覆盖换行符并继续覆盖第二行,直到写入整个字符串。
  • @dragosrsupercool 您是否真的编辑了问题以使其更适合您的答案?

标签: python python-3.x file-handling


【解决方案1】:

如果您有能力一次性将整个文件存储在内存中:

first_line_update = "WRITE IN THE FIRST LINE \n"
with open(tableTempFile, 'r+') as f:
  lines = f.readlines()
  lines[0] = first_line_update
  f.writelines(lines)

否则:

from shutil import copy
from itertools import islice, chain 
# TODO: use a NamedTemporaryFile from the tempfile module
first_line_update = "WRITE IN THE FIRST LINE \n"
with open("inputfile", 'r') as infile, open("tmpfile", 'w+') as outfile:
  # replace the first line with the string provided:
  outfile.writelines(
    (line for line in chain((first_line_update,), islice(infile,1,None)))
  # if you don't want to replace the first line but to insert another line before
  # this simplifies to:
  #outfile.writelines(line for line in chain((first_line_update,), infile))
copy("tmpfile", "infile")
# TODO: remove temporary file

【讨论】:

  • 如果我是正确的,这将有效地替换第一行,而不是在文件开头添加一行。
  • @moooeeeep 在什么情况下其他答案可以替换多行?
  • @Tadeck 那是期望的行为,不是吗?
【解决方案2】:

请注意,Python 中的任何内置函数都无法做到这一点。

您可以在 LINUX 中使用 tail / cat 等轻松做到这一点。

对于通过 Python 进行操作,我们必须使用辅助文件,而对于非常大的文件,我认为这种方法是可能的:

def add_line_at_start(filename,line_to_be_added):
    f = fileinput.input(filename,inplace=1)
    for xline in f:
        if f.isfirstline():
            print line_to_be_added.rstrip('\r\n') + '\n' + xline,
        else:
            print xline

注意:

  1. 在处理大文件时,切勿尝试使用 read() / readlines() 函数。这些方法尝试将完整的文件加载到您的内存中

  2. 在您给定的代码中,seek 函数将带您作为起点,但您编写的所有内容都会覆盖当前内容

【讨论】:

  • 是的,我正要说。您可能还可以将文件访问权限更改为只写(如果可能的话)。
  • 你更快 :) 删除我的答案。
【解决方案3】:

一般情况下,您不能这样做。文件是字节序列,而不是行序列。此数据模型不允许在任意点插入 - 您可以将一个字节替换为另一个字节,也可以在末尾附加字节。

您可以:

  • 替换文件中的前 X 个字节。如果您可以确保第一行的长度永远不变,这可能对您有用。
  • 截断文件,写入第一行,然后重写所有其余部分。如果您无法将所有文件放入内存中,则:
    • 创建一个临时文件(tempfile 模块将为您提供帮助)
    • 写下你的台词
    • r 中打开您的基本文件,并将其第一行之后的内容分段复制到临时文件中
    • 关闭两个文件,然后用临时文件替换输入文件

(请注意,追加到文件末尾要容易得多 - 您只需在追加 a 模式下打开文件。)

【讨论】:

  • 看起来@moooeeeep 的回答描述了相同的解决方案
猜你喜欢
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
相关资源
最近更新 更多