Error in converting multiple FASTA files to Nexus using Biopython
我想使用bio.seqio模块将多个fasta格式文件(dna序列)转换为nexus格式,但我得到以下错误:
1 2 3 4 5 6 7 8 9 10 11 12
| 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' |
我错过了什么?
这是我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| ##!/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)) |
- 请包括整个回溯,以便我们可以看到错误出现在哪一行。
- @Ramon请不要删除您的原始代码和问题,否则答案与问题不匹配。如果您更改了代码并出现了新的错误,只需在底部进行编辑。
- 好的,对不起。
这段代码应该可以解决我能看到的大多数问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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)) |
我改变了一些事情。首先,我订购了你的进口(私人物品),并确保从Bio.Alphabet进口IUPAC,这样你就可以为你的序列分配正确的字母。接下来,在您的process()函数中,我添加了一行,将扩展名从文件名中分离出来,然后将完整的文件名用于第一个参数,只使用基文件(不带扩展名)来命名nexus输出文件。说到这一点,我假设您将在后面的代码中使用Nexus模块?如果没有,您应该从导入中删除它。
我不知道最后一个片段的意义是什么,所以我没有包括它。不过,在本文中,您似乎在浏览文件树,并再次对每个文件执行process(),然后引用一个名为count的未定义变量。相反,只需运行一次process(),然后在该循环中执行count所指的任何操作。
您可能需要考虑在for循环中添加一些逻辑,以测试os.path.join()返回的文件实际上是一个fasta文件。否则,如果您搜索的某个目录中有任何其他文件类型,并且您使用了cx1(4),则可能会发生各种奇怪的事情。
编辑
好的,根据您的新代码,我有一些建议。第一,路线
1
| files = os.listdir(os.curdir) |
是完全不必要的,正如下面的process()函数的定义,您要重新定义files变量。此外,由于您没有调用os.curdir(),所以上述行将失败,您只是将其引用传递给os.listdir()。
底部的代码应该是:
1 2
| for file in os.listdir(test):
print(process(file)) |
for file in files是多余的,用一个参数调用os.path.join()毫无用处。
- 谢谢您!只能更改当前目录的代码。我收到这个错误:file"/library/python/2.7/site packages/bio/alignio/u init_uuuuuy",第214行,在write count=writer_class(fp).write_file(alignments)file"/library/python/2.7/site packages/bio/alignio/nexusio.py",第98行,在write_file self.write_-alignment(first_-alignment)file"/library/python/2.7/site-packages/bio/aligno.py",第105行,在"写入对齐"中,升高valueerror("必须至少有一个序列")valueerror:必须至少有一个序列
- @Ramon你什么意思?只有当前目录?只要把你想扫描的目录放到test中就行了。
- 是的,但它一直在说:valueerror:必须至少有一个序列。我修改了代码:test="/users/teton/desktop/bucky",bucky文件夹中有数百个文件。
- 看看你的.fa文件。它们是否至少有一个序列?我刚刚在一个fasta文件上运行了SeqIO.convert()代码,我碰巧有一个单独的dna序列在其中,它返回了一个.nex文件,很好,打印了1(我猜是序列数吗?).
- 请从这里获取一些.fa文件,并参见:db.tt/rs7zjcfp
- @拉蒙,这是结果,请检查一下,确保它们看起来正常。
- 我的代码运行正常。我没有做os.walk业务,只是用os.listdir()在指定目录中创建文件列表,然后进行处理。
- @Ramon当您打开一个python解释器并运行import Bio; print(Bio.__version__)时会得到什么?另外,当你运行import sys; print(sys.version)时,你会得到什么?
- 是的,马特莫,它的对应物。它们采用Nexus格式。非常感谢。我更新了我的代码,基于您提供的代码,只针对当前目录,但我得到了我在我的问题中输入的错误。导入bio;打印(bio.u版本):1.67
- 你能在回答中提供你最新的代码吗,不用os.walk。
- @拉蒙看我上面的编辑
- 哇!我现在有了!非常感谢!
命名错误
您导入了seqio,但正在调用seqio.convert()。python区分大小写。行应为:
1
| return SeqIO.convert(filename + '.fa',"fasta", filename + '.nex',"nexus", alphabet=IUPAC.ambiguous_dna) |
ioerror:for files in os.walk(test):。
无法打开文件时引发IOERROR。它经常出现,因为提供的文件名和/或文件路径不存在。
os.walk(test)遍历路径test中的所有子目录。在每次迭代中,files将是一个包含3个元素的列表。第一个元素是目录的路径,第二个元素是该路径中的子目录列表,第三个元素是该路径中的文件列表。您应该向process()传递一个文件名,但在process(files)中传递一个列表。
您已经在该块中正确地实现了for root, dirs, files in os.walk(test):。我建议您在下面的for循环中同样地实现它。
您正在将.fa添加到您的filename。不要加.fa。
- 谢谢。现在我有了这个错误!返回seqio.convert(filename+'.fa'、'fasta'、'filename+'.nex'、'nexus'、alphabet=iupac.ambiguous_dna)文件"/library/python/2.7/site packages/bio/seqio/uuu init_uuuuy.py",第1003行,在转换时使用as_handle(in_file,in_mode),如在_handle:file/system/library/frameworks/python.framework/versions/2.7/li&zwnj;&8203;b/python2.7/contextlj;&8203;ib.py",第17行,在enter return self.gen.next()file"/library/python/2.7/site packages/bio/file.py"中,第88行,在as诳handle with open(handleish,mode,**kwargs)中,作为fp:ioerror:[errno 2]没有此类文件或目录
- 我已经编辑了我的答案以发表你的评论。我建议您编辑您的问题,将您在评论中提供的信息包括在内,因此我的回答对将来遇到这种情况的其他人来说是有意义的。
- 谢谢您。我会的。实际上我不需要子目录,只需要当前目录就可以了。现在,我得到一个错误,说:没有这样的文件或目录:"/users/teton/desktop/bucky/cluster1.fa.fa",为什么它假定一个额外的.fa?cluster1.fa存在。
- 如果不需要通过子目录进行递归。看看这个答案。你得到这个错误是因为,你已经完成了filename + '.fa'。不要添加.fa。
- @Ramon因为你的参数包括filename +".fa"。或者传递cluster1,或者调整命名约定。
- 我删除了".fa",但仍然得到相同的错误。
- @Ramon你确定/Users/teton/Desktop/bucky/cluster1.fa的路径存在吗?您有读取文件的权限吗?
- 这是路径:"/users/teton/desktop/bucky"。集群*.fa是文件。
- 做一些调试。在for循环之外尝试进程("users/teton/desktop/bucky/cluster1.fa"),看看它是否工作。如果还没有打开,尝试使用with open()在python中打开文件,看看是否可以读取它。
- 好的,我将同时更新代码和错误,这次只对目录中的文件进行更新。