使用Biopython将多个FASTA文件转换为Nexus时出错

时间:2016-07-23 23:51:20

标签: python biopython fasta

我想使用BIO.SeqIO模块将多个FASTA格式文件(DNA序列)转换为NEXUS格式,但是我收到此错误:

Traceback (most recent call last):
  File "fasta2nexus.py", line 28, in <module>
    print(process(fullpath))
  File "fasta2nexus.py", line 23, in process
    alphabet=IUPAC.ambiguous_dna)
  File "/Library/Python/2.7/site-packages/Bio/SeqIO/__init__.py", line 1003, in convert
    with as_handle(in_file, in_mode) as in_handle:
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 17, in __enter__
    return self.gen.next()
  File "/Library/Python/2.7/site-packages/Bio/File.py", line 88, in as_handle
    with open(handleish, mode, **kwargs) as fp:
IOError: [Errno 2] No such file or directory: 'c'

我错过了什么?

这是我的代码:

##!/usr/bin/env python

from __future__ import print_function # or just use Python 3!

import fileinput
import os
import re
import sys

from Bio import SeqIO, Nexus
from Bio.Alphabet import IUPAC


test = "/Users/teton/Desktop/test"

files = os.listdir(os.curdir)

def process(filename):
    # retuns ("basename", "extension"), so [0] picks "basename"
    base = os.path.splitext(filename)[0] 
    return SeqIO.convert(filename, "fasta", 
                         base + ".nex", "nexus", 
                         alphabet=IUPAC.ambiguous_dna)

for files in os.listdir(test):
    for file in files:
        fullpath = os.path.join(file)
        print(process(fullpath))

2 个答案:

答案 0 :(得分:3)

此代码应解决我能看到的大部分问题。

from __future__ import print_function # or just use Python 3!

import fileinput
import os
import re
import sys

from Bio import SeqIO, Nexus
from Bio.Alphabet import IUPAC

test = "/Users/teton/Desktop"

def process(filename):
    # retuns ("basename", "extension"), so [0] picks "basename"
    base = os.path.splitext(filename)[0] 
    return SeqIO.convert(filename, "fasta", 
                         base + ".nex", "nexus", 
                         alphabet=IUPAC.ambiguous_dna)

for root, dirs, files in os.walk(test):
    for file in files:
        fullpath = os.path.join(root, file)
        print(process(fullpath))
我改变了一些事情。首先,我订购了您的导入(个人物品),并确保从IUPAC导入Bio.Alphabet,这样您就可以为序列分配正确的字母。接下来,在process()函数中,我添加了一行来将扩展名从文件名中拆分,然后使用第一个参数的完整文件名,以及用于命名Nexus输出文件的基数(不带扩展名)。说到这一点,我假设您将在以后的代码中使用Nexus模块?如果没有,您应该从导入中删除它。

我不确定最后一个片段的重点是什么,所以我没有包含它。但是,在它中,您似乎正在遍历文件树并再次process()每个文件 ,然后引用一个名为count的未定义变量。相反,只需运行process()一次,然后执行该循环中count所指的任何内容。

您可能需要考虑在for循环中添加一些逻辑,以测试os.path.join()实际返回的文件是 FASTA文件。否则,如果您搜索的其中一个目录中有任何其他文件类型,并process()它,则可能会发生各种奇怪的事情。

修改

好的,根据你的新代码,我有一些建议。第一,行

files = os.listdir(os.curdir)

完全没必要,因为在process()函数的定义下方,您重新定义了files变量。此外,上述行会失败,因为您没有调用os.curdir(),您只是将其引用传递给os.listdir()

底部的代码应该是这样的:

for file in os.listdir(test):
    print(process(file))

for file in files是多余的,使用单个参数调用os.path.join()不会做任何事情。

答案 1 :(得分:0)

  1. NameError
  2. 您导入了SeqIO,但正在调用seqIO.convert()。 Python区分大小写。该行应为:

    return SeqIO.convert(filename + '.fa', "fasta", filename + '.nex', "nexus", alphabet=IUPAC.ambiguous_dna)
    
    1. IOError:for files in os.walk(test):
    2. 无法打开文件时引发IOError。这通常是因为提供的文件名和/或文件路径不存在。

      os.walk(test)遍历路径test中的所有子目录。在每次迭代期间,files将是3个元素的列表。第一个元素是目录的路径,第二个元素是该路径中的子目录列表,第三个元素是该路径中的文件列表。您应该将文件名传递给process(),但是您要在process(files)中传递一个列表。

      您已在此块for root, dirs, files in os.walk(test):中正确实施。我建议您在下面的for循环中类似地实现它。

      1. 您正在向.fa添加filename。不要添加.fa