我是初学者。我用下面的伪代码写了一个Python程序:
- 定义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.open
。io.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_calculator
的out_file
和fasta
参数具有相同的类型,这看起来是一致的。
open
函数接受一个文件名并返回一个文件对象。metagenome_simulator
返回一个文件对象。您将其作为fasta
传递,然后在其上使用open
。但是你不需要打开它,因为它已经是一个打开的文件,而不仅仅是一个文件名。