1

入力としてファイル名を受け取り(またはstdinから読み取り)、stdoutに書き込むカスタムunixコマンドを使用して、Pythonからテキストファイルを並べ替えています。myfile並べ替えて、並べ替えたバージョンをその場所に保持したいと思います。Pythonからこれを実行して一時ファイルを作成する最良の方法はありますか?私の現在の解決策は次のとおりです。

inputfile = "myfile"
# inputfile: filename to be sorted
tmpfile = "%s.tmp_file" %(inputfile)
cmd = "mysort %s > %s" %(inputfile, tmpfile)
# rename sorted file to be originally sorted filename
os.rename(tmpfile, inputfile)

これが最善の解決策ですか?ありがとう。

4

4 に答える 4

3

一時ファイルを作成したくない場合は、次のようsubprocessに使用できます。

import sys
import subprocess

fname = sys.argv[1]
proc = subprocess.Popen(['sort', fname], stdout=subprocess.PIPE)
stdout, _ = proc.communicate()
with open(fname, 'w') as f:
    f.write(stdout)
于 2013-01-19T00:47:40.910 に答える
1

一時ファイルを作成するか、ファイル全体をメモリに読み込んでコマンドにパイプする必要があります。

于 2013-01-19T00:35:57.857 に答える
1

最善の解決策は、Windowsでも機能するため、os.replaceを使用することです。

しかし、これは私が「インプレースソート」と見なしているものではありません。通常、インプレースソートとは、コピーを行わずにリスト内の単一の要素を実際に交換することを意味します。元のリストを上書きする前に、ソートされたリストを完全に構築する必要があるため、コピーを作成しています。ファイルが非常に大きくなると、これは明らかに機能しなくなります。その時点で、おそらくアトミック性とインプレース性のどちらかを選択する必要があります。

Pythonが古すぎてos.replaceを使用できない場合は、os.replaceを追加するバグに多くのリソースがあります。

一時ファイルの他の使用法については、tempfileモジュールの使用を検討できますが、この場合はあまりメリットがないと思います。

于 2013-01-19T00:42:19.410 に答える
0

切り捨て書き込みパターンを試すことができます。

with open(filename, 'r') as f:
   model.read(f)
model.process()
with open(filename, 'w') as f:
   model.write(f)

これは非アトミックであることに注意してください

このエントリでは、Pythonでファイルを更新することの長所と短所について説明します。http: //blog.gocept.com/2013/07/15/reliable-file-updates-with-python/

于 2014-06-19T02:17:16.893 に答える