管道输出Linux排序的最佳方法

时间:2013-07-23 18:45:14

标签: python

我想逐行处理文件。但是我需要先按照惯例进行排序:

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

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

3 个答案:

答案 0 :(得分:3)

很容易。使用subprocess.Popen运行sort并读取其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'

答案 1 :(得分:0)

我相信sort会读取内存中的所有数据,所以我不确定你会赢得什么但是你可以在subprocess中使用shell=True并使用管道

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

答案 2 :(得分:0)

我认为this page会回答你的问题

我更喜欢的答案来自@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相同的操作,除了它为您提供了一个类似文件的对象,您可以使用该对象访问该进程的标准输入/输出。还有3种其他的popen变体,它们对i / o的处理方式略有不同。如果您将所有内容都作为字符串传递,那么您的命令将传递给shell;如果你将它们作为列表传递,那么你不必担心逃避任何事情 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函数是很好的 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函数,但我不建议直接使用它们。

  6. subprocess模块应该是您使用的模块。