Python 2.7 glob.glob函数从文件中提取数据
我正在尝试运行下面的脚本。该脚本的目的是逐个打开不同的fasta文件,并提取geneID。如果我不使用glob.glob函数,脚本运行良好。我收到此消息TypeError:强制使用Unicode:需要字符串或缓冲区,找到列表Python 2.7 glob.glob函数从文件中提取数据,python-2.7,biopython,Python 2.7,Biopython,我正在尝试运行下面的脚本。该脚本的目的是逐个打开不同的fasta文件,并提取geneID。如果我不使用glob.glob函数,脚本运行良好。我收到此消息TypeError:强制使用Unicode:需要字符串或缓冲区,找到列表 files='/home/pathtofiles/files' #print files #sys.exit() for file in files: fastas=sorted(glob.glob(files + '/*.fasta
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
我正在运行的想法,如何直接脚本打开时,文件一个接一个给我需要的信息 我知道你想做什么,但首先让我解释一下为什么你目前的方法不起作用 您有一个指向包含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
循环时,只需在该字符串中的字符上迭代即可
另外,正如正确观察到的,在您的代码中,fastas
是一个列表,open
需要一个文件路径作为第一个参数。这就是为什么会出现TypeError:。。。需要字符串。。。找到列表
顺便说一句(这在Windows上比在Linux或Mac上更成问题),但在使用路径名时,最好始终使用(在字符串前面加上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
另一个好的实践是在组合路径名和文件名时使用。这可以防止脚本在机器上运行时出现细微的错误。如果您的同事使用不同的操作系统,则会在机器上出现错误
我也会推荐。这样可以确保文件句柄在处理完毕后正确关闭
作为最后一句话,这是功能,因为这可能会导致错误或混乱以后
结合以上所有内容,我会像这样重写您的代码:
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
这就是我解决问题的方法,这个脚本很有效
fastas
是一个列表吗?i、 e.在这里output\u handle=(open(fastas,'r+'))
在ref\u gene=query\u genes[geneID]行中.format('fasta')
的用法是什么?请修复您的缩进,因为发布的脚本将不起作用。@BioGeek。这是一种将我提取的序列格式化为fasta格式的非常优雅的方法。而不是通过“'>'+基因+'\n'+seq+'\n'`”。这是Biopython的功能之一。@BioSeek。它还以漂亮的fasta格式打印。酷!我不知道你能做到。我今天学到了一些新东西,谢谢!:-)
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'