glob.glob函数用于从文件中提取数据

时间:2017-09-27 15:43:43

标签: 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'))
        #print fastas[0]
        output_handle=(open(fastas, 'r+'))
        genes_files=list(SeqIO.parse(output_handle, 'fasta'))
        geneID=genes_files[0].id
        print geneID

我正在运行有关如何在文件接一个时打开脚本以向我提供需求信息的想法。

2 个答案:

答案 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 opening 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'