[英]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();
請注意,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
注意:
在處理大文件時,切勿嘗試使用read()/ readlines()函數。 這些方法嘗試將整個文件加載到您的內存中
在您給定的代碼中,搜索功能將以您為起點,但隨后您編寫的所有內容都將覆蓋當前內容
如果你能負擔得起將整個文件同時存儲在內存中:
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
一般來說,你不能這樣做。 文件是字節序列,而不是行序列。 此數據模型不允許在任意點插入 - 您可以將字節替換為另一個字節,也可以在末尾附加字節。
你可以:
tempfile
模塊會幫你) r
打開您的基本文件,並在第一行之后將其內容復制到臨時文件中 (請注意,附加到文件的結尾是很容易-所有你需要做的就是打開在附加文件a
模式。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.