Python 2.7 glob.glob函数从文件中提取数据

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

我正在尝试运行下面的脚本。该脚本的目的是逐个打开不同的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

我正在运行的想法,如何直接脚本打开时,文件一个接一个给我需要的信息

我知道你想做什么,但首先让我解释一下为什么你目前的方法不起作用

您有一个指向包含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'