我想逐行处理文件。但是,我需要先对其进行排序,这通常通过管道进行:
sort --key=1,2 data |./script.py.
从 python 中调用 sort 的最佳方法是什么?在线搜索我看到subprocess
或sh
模块可能是可能性?我不想将文件读入内存并在 python 中排序,因为数据非常大。
我想逐行处理文件。但是,我需要先对其进行排序,这通常通过管道进行:
sort --key=1,2 data |./script.py.
从 python 中调用 sort 的最佳方法是什么?在线搜索我看到subprocess
或sh
模块可能是可能性?我不想将文件读入内存并在 python 中排序,因为数据非常大。
这简单。使用 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'
我相信 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 调用系统 shell 可能会带来安全隐患。有关详细信息,请参阅常用参数下的警告。
我想这个页面会回答你的问题
我更喜欢@Eli Courtwright 的答案是(全部逐字引用):
下面总结一下调用外部程序的方式以及各自的优缺点:
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
stream = os.popen("some_command with args")
os.system
除了它给你一个类似文件的对象,你可以使用它来访问该进程的标准输入/输出之外,它将做同样的事情。popen 还有 3 个其他变体,它们对 i/o 的处理都略有不同。如果您将所有内容都作为字符串传递,那么您的命令将传递给 shell;如果您将它们作为列表传递,那么您无需担心转义任何内容。
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 函数。
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
模块可能应该是您使用的。