巨大なファイルの最初の行を読んで変更するだけです。
ファイルの最初の行だけを変更し、Pythonを使用して別のファイルとして保存するトリックはありますか?私のコードはすべてPythonで行われており、一貫性を保つのに役立ちます。
アイデアは、ファイル全体を読み取ってから書き込む必要がないことです。
巨大なファイルの最初の行を読んで変更するだけです。
ファイルの最初の行だけを変更し、Pythonを使用して別のファイルとして保存するトリックはありますか?私のコードはすべてPythonで行われており、一貫性を保つのに役立ちます。
アイデアは、ファイル全体を読み取ってから書き込む必要がないことです。
shutil.copyfileobj()
行ごとに実行するよりもはるかに高速です。ドキュメントからのメモ:
[from_file] オブジェクトの現在のファイル位置が 0 でない場合、現在のファイル位置からファイルの末尾までの内容のみがコピーされることに注意してください。
したがって:
from_file.readline() # and discard
to_file.write(replacement_line)
shutil.copyfileobj(from_file, to_file)
ファイルの先頭行を変更して新しいファイル名で保存する場合、ファイル全体を反復せずに最初の行を変更することはできません。明るい面としては、端末に印刷しない限り、ファイルの最初の行を変更することは、非常に大きなファイルであっても非常に高速です。
テキストベースのファイル (バイナリではない) で作業していると仮定すると、これはニーズに適合し、ほとんどのアプリケーションで十分に機能するはずです。
import os
newline = os.linesep # Defines the newline based on your OS.
source_fp = open('source-filename', 'r')
target_fp = open('target-filename', 'w')
first_row = True
for row in source_fp:
if first_row:
row = 'the first row now says this.'
first_row = False
target_fp.write(row + newline)
対象外の行を反復処理する必要のない代替ソリューション。
def replace_first_line( src_filename, target_filename, replacement_line):
f = open(src_filename)
first_line, remainder = f.readline(), f.read()
t = open(target_filename,"w")
t.write(replacement_line + "\n")
t.write(remainder)
t.close()
新しい線が古い線と同じ長さでない限り、これはできません。そうであれば、この問題はmmapで解決できます。
「Nacho」回答の実例は次のとおりです。
import subprocess
cmd = ['sed', '-i', '-e', '1,1s/.*/' + new_line + '/g', 'filename.txt']
subprocess.call(cmd)