我正在尝试运行下面的脚本。该脚本的目的是一个接一个地打开不同的fasta文件,并提取geneID。如果我不使用glob.glob函数,该脚本运行良好。我收到此消息 TypeError:强制转换为Unicode:需要字符串或缓冲区,找到列表
files='/home/pathtofiles/files'
#print files
#sys.exit()
for file in files:
fastas=sorted(glob.glob(files + '/*.fasta'))
#print fastas[0]
output_handle=(open(fastas, 'r+'))
genes_files=list(SeqIO.parse(output_handle, 'fasta'))
geneID=genes_files[0].id
print geneID
我正在运行有关如何在文件接一个时打开脚本以向我提供需求信息的想法。
答案 0 :(得分:3)
我知道你要做什么,但让我先解释一下为什么你现在的方法不起作用。
您有一个带有fasta文件的目录的路径,并且您想循环遍历该目录中的文件。但请注意如果我们这样做会发生什么:
>>> files='/home/pathtofiles/files'
>>> for file in files:
>>> print file
/
h
o
m
e
/
p
a
t
h
t
o
f
i
l
e
s
/
f
i
l
e
s
不是您期望的文件名列表! files
是一个字符串,当您在字符串上应用for
循环时,只需遍历该字符串中的字符。
此外,正确地观察doctorlove时,代码中fastas
是一个列表,open
期望文件的路径作为第一个参数。这就是你获得TypeError: ... need string, ... list found
的原因。
顺便说一下(这在Windows上比在Linux或Mac上更是一个问题),但在使用时,总是使用raw string literals(在字符串前加r
)是一种好习惯。路径名,以防止不必要地将反斜杠转义的序列(如\n
和\t
扩展到换行符和制表符。
>>> path = 'C:\Users\norah\temp'
>>> print path
C:\Users
orah emp
>>> path = r'C:\Users\norah\temp'
>>> print path
C:\Users\norah\temp
另一个好的做法是在组合路径名和文件名时使用os.path.join()
。这可以防止您的脚本在您的计算机上运行时出现的细微错误错误会导致您的同事拥有不同操作系统的计算机出错。
我还建议using the with
statement when open
ing files。这样可确保文件句柄在您完成后正确关闭。
作为最后的评论,file
is a built-in function in Python并且它是bad practice to use a variable with the same name as a built-in函数,因为这可能会导致错误或混淆。
综合以上所有内容,我会像这样重写你的代码:
import os
import glob
from Bio import SeqIO
path = r'/home/pathtofiles/files'
pattern = os.path.join(path, '*.fasta')
for fasta_path in sorted(glob.glob(pattern)):
print fasta_path
with open(fasta_path, 'r+') as output_handle:
genes_records = SeqIO.parse(output_handle, 'fasta')
for gene_record in genes_records:
print gene_record.id
答案 1 :(得分:-2)
这是我解决问题的方法,这个脚本有效。
import os,sys
import glob
from Bio import SeqIO
def extracting_information_gene_id():
#to extract geneID information and add the reference gene to each different file
files=sorted(glob.glob('/home/path_to_files/files/*.fasta'))
#print file
#sys.exit()
for file in files:
#print file
output_handle=open(file, 'r+')
ref_genes=list(SeqIO.parse(output_handle, 'fasta'))
geneID=ref_genes[0].id
#print geneID
#sys.exit()
#to extract the geneID as a reference record from the genes_files
query_genes=(SeqIO.index('/home/path_to_file/file.fa', 'fasta'))
#print query_genes[geneID].format('fasta') #check point
#sys.exit()
ref_gene=query_genes[geneID].format('fasta')
#print ref_gene #check point
#sys.exit()
output_handle.write(str(ref_gene))
output_handle.close()
query_genes.close()
extracting_information_gene_id()
print 'Reference gene sequence have been added'