写入文件时出错

时间:2013-11-08 11:23:15

标签: sorting python-2.7 subprocess

我编写了一个使用子进程模块调用unix排序的python脚本。我试图基于两列(2和6)对表进行排序。这就是我所做的

sort_bt=open("sort_blast.txt",'w+')
sort_file_cmd="sort -k2,2 -k6,6n {0}".format(tab.name)
subprocess.call(sort_file_cmd,stdout=sort_bt,shell=True)

然而,输出文件包含一个不完整的行,当我解析表时会产生错误,但是当我检查输入文件中的条目时,对该行进行排序看起来很完美。我想当sort尝试将结果写入指定的文件时会出现问题,但我不知道如何解决它。

输入文件

中的行如下所示
  

GI | 191252805 | REF | NM_001128633.1 | Homo sapiens RIMS结合蛋白3C(RIMBP3C),mRNA gnl | BL_ORD_ID | 4614 gi | 124487059 | ref | NP_001074857.1 | RIMS结合蛋白2 [Mus musculus] 103 2877 3176 846 941 1.0102e-07 138.0

在输出文件中,只打印了gi | 19125。我该如何解决这个问题?

任何帮助将不胜感激。

拉​​姆

2 个答案:

答案 0 :(得分:0)

考虑到python有一个用于对项目进行排序的内置方法,使用子进程调用外部排序工具似乎很愚蠢。

查看您的示例数据,它似乎是结构化数据,带有|分隔符。以下是打开该文件的方法,并以排序的方式迭代python中的结果:

def custom_sorter(first, second):
    """ A Custom Sort function which compares items
    based on the value in the 2nd and 6th columns. """
    # First, we break the line into a list
    first_items, second_items = first.split(u'|'), second.split(u'|')  # Split on the pipe character.
    if len(first_items) >= 6 and len(second_items) >= 6:
        # We have enough items to compare
        if (first_items[1], first_items[5]) > (second_items[1], second_items[5]):
            return 1
        elif (first_items[1], first_items[5]) < (second_items[1], second_items[5]):
            return -1
        else:  # They are the same
            return 0  # Order doesn't matter then
    else:
        return 0

with open(src_file_path, 'r') as src_file:
    data = src_file.read()  # Read in the src file all at once. Hope the file isn't too big!
    with open(dst_sorted_file_path, 'w+') as dst_sorted_file:
        for line in sorted(data.splitlines(), cmp = custom_sorter):  # Sort the data on the fly
            dst_sorted_file.write(line)  # Write the line to the dst_file.

仅供参考,此代码可能需要一些晃动。我没有把它测试得太好。

答案 1 :(得分:0)

您看到的可能是尝试同时从多个进程写入文件的结果。

在Python中模拟:sort -k2,2 -k6,6n ${tabname} > sort_blast.txt命令:

from subprocess import check_call

with open("sort_blast.txt",'wb') as output_file:
     check_call("sort -k2,2 -k6,6n".split() + [tab.name], stdout=output_file)

你可以用纯Python编写它,例如,对于一个小的输入文件:

def custom_key(line):
    fields = line.split() # split line on any whitespace
    return fields[1], float(fields[5]) # Python uses zero-based indexing

with open(tab.name) as input_file, open("sort_blast.txt", 'w') as output_file:
     L = input_file.read().splitlines() # read from the input file
     L.sort(key=custom_key)             # sort it
     output_file.write("\n".join(L))    # write to the output file

如果您需要对不适合内存的文件进行排序;见Sorting text file by using Python