3

ファイルを1行ずつ処理したいと思います。ただし、通常はパイプで並べ替える必要があります。

sort --key=1,2 data |./script.py.  

Python内からソートを呼び出すのに最適なものは何ですか? オンラインで検索するとsubprocessshモジュールが可能性がありますか? データが非常に大きいため、ファイルをメモリに読み込んでPythonでソートしたくありません。

4

3 に答える 3

3

それは簡単です。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'
于 2013-07-23T19:15:05.517 に答える
0

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 を指定してシステム シェルを呼び出すと、信頼できない入力と組み合わせると、セキュリティ上の危険が生じる可能性があります。詳細については、よく使用される引数の警告を参照してください。

于 2013-07-23T18:53:40.807 に答える
0

このページがあなたの質問に答えてくれると思います

@Eli Courtwrightからの私が好む答えは(すべて逐語的に引用されています):

外部プログラムを呼び出す方法の概要と、それぞれの長所と短所を次に示します。

  1. os.system("some_command with args")コマンドと引数をシステムのシェルに渡します。この方法で一度に複数のコマンドを実際に実行し、パイプと入力/出力のリダイレクトを設定できるため、これは便利です。たとえば、
    os.system("some_command < input_file | another_command > output_file")
    これは便利ですが、スペースなどのシェル文字のエスケープを手動で処理する必要があります。一方、これにより、実際には外部プログラムではなく単なるシェル コマンドであるコマンドを実行することもできます。
    http://docs.python.org/lib/os-process.html

  2. stream = os.popen("some_command with args")os.systemそのプロセスの標準入出力にアクセスするために使用できるファイルのようなオブジェクトを提供することを除いて、 と同じことを行います。popen には他に 3 つのバリアントがあり、すべて i/o の処理が少し異なります。すべてを文字列として渡すと、コマンドがシェルに渡されます。それらをリストとして渡す場合、エスケープについて心配する必要はありません。
    http://docs.python.org/lib/os-newstreams.html

  3. モジュールの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

  4. モジュールからのcall関数subprocess。これは基本的にPopenクラスと同じで、すべて同じ引数を取りますが、コマンドが完了して戻りコードが返されるまで待つだけです。例:
    return_code = call("echo Hello World", shell=True)
    http://docs.python.org/lib/node529.html

  5. os モジュールには、C プログラムに含まれるすべての fork/exec/spawn 関数も含まれていますが、それらを直接使用することはお勧めしません。

subprocessモジュールはおそらくあなたが使用するものであるべきです。

于 2013-07-23T18:55:57.083 に答える