如何将一个函数(具体来说,是一个文件)的结果正确地传递给另一个函数



我是初学者。我用下面的伪代码写了一个Python程序:

  1. 定义Function1。

。这个函数需要一个大的单fasta文件(基因组),并将其分成几个片段。

b。这些片段被写入一个多快速输出文件(如下所示)。

  • 定义Function2。
  • 。这个函数读取multi-fasta文件

    中的行。

    b。将fasta id后跟fasta条目的长度写入输出文件。

    大部分代码:

    from Bio import SeqIO
    import io
    def metagenome_simulator(genome_fasta, out_file):
        outfile = open(out_file, "a+b")
        fasta = SeqIO.parse(open(genome_fasta, "rU"), "fasta")
             #does the split, blah, blah - I know this function works on its own already
        len_file.close()
        fasta.close()
        return outfile
    def contig_len_calculator(fasta, out_file):
        outfile = io.open(out_file, "wb")
        fhandle = io.open(fasta, "a+b")
        outfile.write("contig_id" + "t" + "contig_length" + "n")
        for entry in SeqIO.parse(fhandle, "fasta"):
            #calculates lengths, blah, blah - i know this works independently too
         outfile.close()
         fhandle.close()
         return
    def main():
        output = metagenome_simulator(sys.argv[1], sys.argv[2])
        print(output)
        contig_len_calculator(output, sys.argv[3])
     main()
    

    我的命令(bash shell)是:

    ./this_script.py genome_fasta_file split_fasta_out_file final_output_file.
    

    输出将是两个独立的文件,分别对应程序中的每个函数。第一个是分割fasta:

    >split_1
    ATCG....
    >split_2
    ATCG....
    .
    .
    .
    

    第二个是长度文件:

    >split_1    300
    >split_2    550
    .
    .
    .
    

    这不起作用。它运行function1很好,并使split_fasta_output文件,但随后返回:

    <open file 'out_file', mode 'a+b' at 0x7f54b8454d20>
    Traceback (most recent call last):
    File "./this_script.py", line 62, in <module>
    main()
    File "./this_script.py", line 60, in main
    contig_len_calculator(output, sys.argv[3])
    File "./this_script.py", line 47, in contig_len_calculator
    fhandle = io.open(fasta, "a+b")
    TypeError: invalid file: <open file 'out_file', mode 'a+b' at 0x7f54b8454d20>
    

    我不知道为什么它不工作。所以我的问题是:我如何正确地将一个函数中创建的文件传递给另一个函数?

    编辑:把整个追溯错误。

    问题是metagenome_simulator返回一个文件描述符,然后您尝试将其传递给io.openio.open可以是一个整数文件描述符(some_fd.fileno()),也可以是一个路径。简单的解决方案是返回输出文件的路径,而不是输出文件本身。

    def metagenome_simulator(genome_fasta, out_file):
        ...  # your code as-written
        return out_file
    

    但是如果你愿意,你可以这样做:

    def metagenome_simulator(genome_fasta, out_file):
        # completely as-written, including
        return outfile
    def contig_len_calculator(fasta, out_file):
        outfile = io.open(out_file, "wb")
        fhandle = io.open(fasta.fileno(), "a+b")
        ...
    
    第一种方法的优点是它使contig_len_calculatorout_filefasta参数具有相同的类型,这看起来是一致的。

    open函数接受一个文件名并返回一个文件对象。metagenome_simulator返回一个文件对象。您将其作为fasta传递,然后在其上使用open。但是你不需要打开它,因为它已经是一个打开的文件,而不仅仅是一个文件名。

    相关内容

    • 没有找到相关文章