我是初学者。我用以下pseduocode编写了一个Python程序:
一个。这个函数需要一个大的单个fasta文件(基因组)并将其分成几部分。
湾这些部分被写入多个fasta输出文件(例如下面)。
一个。此函数读取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
.
.
.
我不知道它为什么不起作用。所以我的问题是:如何将在一个函数中创建的文件正确传递给另一个函数?
编辑:将整个追溯错误。
答案 0 :(得分:2)
问题是metagenome_simulator
返回一个文件描述符,然后您尝试将其传递到io.open
。 io.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
。但是你不需要打开它,因为它已经是一个打开的文件,而不仅仅是文件名。