33

巨大なファイルの最初の行を読んで変更するだけです。

ファイルの最初の行だけを変更し、Pythonを使用して別のファイルとして保存するトリックはありますか?私のコードはすべてPythonで行われており、一貫性を保つのに役立ちます。

アイデアは、ファイル全体を読み取ってから書き込む必要がないことです。

4

7 に答える 7

37

shutil.copyfileobj()行ごとに実行するよりもはるかに高速です。ドキュメントからのメモ:

[from_file] オブジェクトの現在のファイル位置が 0 でない場合、現在のファイル位置からファイルの末尾までの内容のみがコピーされることに注意してください。

したがって:

from_file.readline() # and discard
to_file.write(replacement_line)
shutil.copyfileobj(from_file, to_file)
于 2013-02-18T23:45:32.987 に答える
4

ファイルの先頭行を変更して新しいファイル名で保存する場合、ファイル全体を反復せずに最初の行を変更することはできません。明るい面としては、端末に印刷しない限り、ファイルの最初の行を変更することは、非常に大きなファイルであっても非常に高速です。

テキストベースのファイル (バイナリではない) で作業していると仮定すると、これはニーズに適合し、ほとんどのアプリケーションで十分に機能するはずです。

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)
于 2013-02-18T23:37:04.363 に答える
3

対象外の行を反復処理する必要のない代替ソリューション。

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()
于 2013-02-18T23:51:03.683 に答える
2

新しい線が古い線と同じ長さでない限り、これはできません。そうであれば、この問題はmmapで解決できます。

于 2013-02-18T23:34:03.687 に答える
0

「Nacho」回答の実例は次のとおりです。

import subprocess

cmd = ['sed', '-i', '-e', '1,1s/.*/' + new_line + '/g', 'filename.txt']

subprocess.call(cmd)
于 2020-07-21T09:58:25.770 に答える