ファイルを1行ずつ処理したいと思います。ただし、通常はパイプで並べ替える必要があります。
sort --key=1,2 data |./script.py.
Python内からソートを呼び出すのに最適なものは何ですか? オンラインで検索するとsubprocess
、sh
モジュールが可能性がありますか? データが非常に大きいため、ファイルをメモリに読み込んでPythonでソートしたくありません。
ファイルを1行ずつ処理したいと思います。ただし、通常はパイプで並べ替える必要があります。
sort --key=1,2 data |./script.py.
Python内からソートを呼び出すのに最適なものは何ですか? オンラインで検索するとsubprocess
、sh
モジュールが可能性がありますか? データが非常に大きいため、ファイルをメモリに読み込んでPythonでソートしたくありません。
それは簡単です。subprocess.Popen を使用してソートを実行し、その stdout を読み取ってデータを取得します。
import subprocess
myfile = 'data'
sort = subprocess.Popen(['sort', '--key=1,2', myfile],
stdout=subprocess.PIPE)
for line in sort.stdout:
your_code_here
sort.wait()
assert sort.returncode == 0, 'sort failed'
sort はメモリ内のすべてのデータを読み取ると信じているので、何かを獲得できるかどうかはわかりませんが、パイプラインで使用shell=True
して使用できますsubprocess
>>> subprocess.check_output("ls", shell = True)
'1\na\na.cpp\nA.java\na.php\nerase_no_module.cpp\nerase_no_module.cpp~\nWeatherSTADFork.cpp\n'
>>> subprocess.check_output("ls | grep j", shell = True)
'A.java\n'
警告
shell=True を指定してシステム シェルを呼び出すと、信頼できない入力と組み合わせると、セキュリティ上の危険が生じる可能性があります。詳細については、よく使用される引数の警告を参照してください。
このページがあなたの質問に答えてくれると思います
@Eli Courtwrightからの私が好む答えは(すべて逐語的に引用されています):
外部プログラムを呼び出す方法の概要と、それぞれの長所と短所を次に示します。
os.system("some_command with args")
コマンドと引数をシステムのシェルに渡します。この方法で一度に複数のコマンドを実際に実行し、パイプと入力/出力のリダイレクトを設定できるため、これは便利です。たとえば、
os.system("some_command < input_file | another_command > output_file")
これは便利ですが、スペースなどのシェル文字のエスケープを手動で処理する必要があります。一方、これにより、実際には外部プログラムではなく単なるシェル コマンドであるコマンドを実行することもできます。
http://docs.python.org/lib/os-process.html
stream = os.popen("some_command with args")
os.system
そのプロセスの標準入出力にアクセスするために使用できるファイルのようなオブジェクトを提供することを除いて、 と同じことを行います。popen には他に 3 つのバリアントがあり、すべて i/o の処理が少し異なります。すべてを文字列として渡すと、コマンドがシェルに渡されます。それらをリストとして渡す場合、エスケープについて心配する必要はありません。
http://docs.python.org/lib/os-newstreams.html
モジュールのPopen
クラス。subprocess
これは の代替として意図されてos.popen
いますが、非常に包括的であるため、やや複雑になるという欠点があります。たとえば、
print Popen("echo Hello World", stdout=PIPE, shell=True).stdout.read()
代わりにと言い
print os.popen("echo Hello World").read()
ますが、4 つの異なる popen 関数ではなく、1 つの統一されたクラスにすべてのオプションがあると便利です。
http://docs.python.org/lib/node528.html
モジュールからのcall
関数subprocess
。これは基本的にPopen
クラスと同じで、すべて同じ引数を取りますが、コマンドが完了して戻りコードが返されるまで待つだけです。例:
return_code = call("echo Hello World", shell=True)
http://docs.python.org/lib/node529.html
os モジュールには、C プログラムに含まれるすべての fork/exec/spawn 関数も含まれていますが、それらを直接使用することはお勧めしません。
subprocess
モジュールはおそらくあなたが使用するものであるべきです。