3

我想逐行处理文件。但是,我需要先对其进行排序,这通常通过管道进行:

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

从 python 中调用 sort 的最佳方法是什么?在线搜索我看到subprocesssh模块可能是可能性?我不想将文件读入内存并在 python 中排序,因为数据非常大。

4

3 回答 3

3

这简单。使用 subprocess.Popen 运行排序并读取其标准输出以获取您的数据。

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=Truesubprocess使用管道

>>> 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 调用系统 shell 可能会带来安全隐患。有关详细信息,请参阅常用参数下的警告。

于 2013-07-23T18:53:40.807 回答
0

我想这个页面会回答你的问题

我更喜欢@Eli Courtwright 的答案是(全部逐字引用):

下面总结一下调用外部程序的方式以及各自的优缺点:

  1. os.system("some_command with args")将命令和参数传递给系统的 shell。这很好,因为您实际上可以以这种方式一次运行多个命令并设置管道和输入/输出重定向。例如
    os.system("some_command < input_file | another_command > output_file")
    ,虽然这很方便,但您必须手动处理 shell 字符(如空格等)的转义。另一方面,这也允许您运行只是 shell 命令而不是实际外部程序的命令。
    http://docs.python.org/lib/os-process.html

  2. stream = os.popen("some_command with args")os.system除了它给你一个类似文件的对象,你可以使用它来访问该进程的标准输入/输出之外,它将做同样的事情。popen 还有 3 个其他变体,它们对 i/o 的处理都略有不同。如果您将所有内容都作为字符串传递,那么您的命令将传递给 shell;如果您将它们作为列表传递,那么您无需担心转义任何内容。
    http://docs.python.org/lib/os-newstreams.html

  3. 模块的Popensubprocess。这旨在作为替代品,os.popen但由于过于全面而具有稍微复杂的缺点。例如,您会说
    print Popen("echo Hello World", stdout=PIPE, shell=True).stdout.read()
    不是,
    print os.popen("echo Hello World").read()
    但最好将所有选项放在一个统一的类中,而不是 4 个不同的 popen 函数。
    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 回答