Python,我如何正确地将一个函数(特别是一个文件)的结果传递给另一个函数?

时间:2015-05-21 21:22:20

标签: python function file ubuntu

我是初学者。我用以下pseduocode编写了一个Python程序:

  1. 定义Function1。
  2. 一个。这个函数需要一个大的单个fasta文件(基因组)并将其分成几部分。

    湾这些部分被写入多个fasta输出文件(例如下面)。

    1. 定义Function2。
    2. 一个。此函数读取multi-fasta文件的行

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

      大部分代码:

      Enumerable.Select(unknown, projection)

      我的命令(bash shell)将是:

      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()
      

      输出将是两个单独的文件,一个用于程序中的每个函数。第一个是分割法:

      ./this_script.py genome_fasta_file split_fasta_out_file final_output_file.
      

      第二个是长度文件:

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

      这不起作用。它运行Fuction1就好了,然后生成split_fasta_output文件,然后返回:

      >split_1    300
      >split_2    550
      .
      .
      .
      

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

      编辑:将整个追溯错误。

2 个答案:

答案 0 :(得分:2)

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

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")
    ...

第一种方法的优点是它使out_file的{​​{1}}和fasta参数具有相同的类型,这似乎是理智的。

答案 1 :(得分:0)

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