我正在编写一个脚本来根据特定列对文件进行排序。我试着打电话给'排序' Linux的命令。我正在使用的代码是:
from subprocess import
path_store = /homes/varshith/maf
input = path_store
field = "-k2"
store_output_in_new_file = ">"
new_path = path_store + "_sort.bed"
sorting = Popen(["sort", field, input, append, new_path], stdout=PIPE)
但这不能正常工作。在此先感谢您的帮助。
答案 0 :(得分:3)
使用communication获取输出:
from subprocess import PIPE,Popen
sorting = Popen(["sort", field, output, append, new_path], stdout=PIPE)
out, err = sorting.communicate()
print out
或者只使用check_output
进行python> = 2.7:
sorting = check_output(["sort", field, output, append, new_path])
如果您只想编写已排序的内容,可以将stdout重定向到文件对象:
output = "path/to/parentfile"
cmd = "sort -k2 {}".format(output)
with open(new_file,"w") as f:
sorting = Popen(cmd.split(),stdout=f)
答案 1 :(得分:0)
首先,我希望output
和new_path
实际上是字符串(我假设是这样,但是你发布的内容并不清楚)。但假设所有这些都已整理出来:
sorting = Popen(...)
sorting_output = sorting.communicate()[0]
这应该将子流程标准输出的内容存储到sorting_output
。
答案 2 :(得分:0)
模拟shell命令:
$ sort -k2 /homes/varshith/maf > /homes/varshith/maf_sort.bed
即,按第二列排序/homes/varshith/maf
文件并将排序后的输出存储到Python中的/homes/varshith/maf_sort.bed
文件中:
#!/usr/bin/env python
from subprocess import check_call
field = '-k2'
input_path = '/homes/varshith/maf'
output_path = input_path + '_sort.bed'
with open(output_path, 'wb', 0) as output_file:
check_call(["sort", field, input_path], stdout=output_file)
它会覆盖输出文件。要改为附加到文件,请使用ab
模式而不是wb
。