3

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. ファイル全体をメモリに入れずにファイル file に書き込む方法は何ですか?
  2. ファイルの先頭に新しい行を追加する方法は?
4

3 に答える 3

4

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関数があなたを出発点にしますが、あなたが書いたものはすべて現在のコンテンツを上書きします

于 2012-07-25T08:45:07.687 に答える
3

ファイル全体を一度にメモリに格納する余裕がある場合:

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
于 2012-07-25T08:54:49.467 に答える
2

通常、それはできません。ファイルは一連の行ではなく、一連のバイトです。このデータ モデルでは、任意のポイントに挿入することはできません。バイトを別のバイトに置き換えるか、最後にバイトを追加することができます。

次のいずれかを実行できます。

  • ファイルの最初の X バイトを置き換えます。最初の行の長さが変わらないことを確認できる場合、これはうまくいく可能性があります。
  • ファイルを切り捨て、最初の行を書き、その後の残りをすべて書き直します。すべてのファイルをメモリに収めることができない場合は、次のようにします。
    • 一時ファイルを作成します (tempfileモジュールが役立ちます)
    • それにあなたの行を書いてください
    • ベースファイルを開きr、最初の行の後にその内容を一時ファイルに部分的にコピーします
    • 両方のファイルを閉じてから、入力ファイルを一時ファイルに置き換えます

(ファイルの末尾に追加する方がはるかに簡単であることに注意してください。必要なのは、ファイルを追加aモードで開くことだけです。)

于 2012-07-25T09:21:33.093 に答える