簡體   English   中英

如何有效地將新行添加到大文件的開頭?

[英]How to efficiently append a new line to the starting of a large file?

我想在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. 如何在文件開頭添加新行?

請注意,Python中的任何內置函數都無法做到這一點。

您可以使用tail / cat等在LINUX中輕松完成此操作。

為了通過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. 在您給定的代碼中,搜索功能將以您為起點,但隨后您編寫的所有內容都將覆蓋當前內容

如果你能負擔得起將整個文件同時存儲在內存中:

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

一般來說,你不能這樣做。 文件是字節序列,而不是行序列。 此數據模型不允許在任意點插入 - 您可以將字節替換為另一個字節,也可以在末尾附加字節。

你可以:

  • 替換文件中的前X個字節。 如果您可以確保第一行的長度永遠不會變化,這可能對您有用。
  • 截斷文件,寫第一行,然后重寫其余的所有內容。 如果您無法將所有文件放入內存中,那么:
    • 創建一個臨時文件( tempfile模塊會幫你)
    • 寫你的線
    • r打開您的基本文件,並在第一行之后將其內容復制到臨時文件中
    • 關閉這兩個文件,然后用臨時文件替換輸入文件

(請注意,附加到文件的結尾是很容易-所有你需要做的就是打開在附加文件a模式。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM