我想逐行处理文件。但是我需要先按照惯例进行排序:
sort --key=1,2 data |./script.py.
在python中调用sort的最佳方法是什么?在线搜索我可能会看到subprocess
或sh
模块?我不想将文件读入内存并在python中排序,因为数据非常大。
答案 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(全部引用逐字):
以下是调用外部程序的方法及其优缺点的摘要:
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
相同的操作,除了它为您提供了一个类似文件的对象,您可以使用该对象访问该进程的标准输入/输出。还有3种其他的popen变体,它们对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
模块应该是您使用的模块。