使用 Biopython 将多个 FASTA 文件转换为 Nexus 时出错
Error in converting multiple FASTA files to Nexus using Biopython
我想使用 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))
- 名称错误
您导入了 SeqIO 但正在调用 seqIO.convert()。 Python 区分大小写。该行应为:
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
.
这段代码应该可以解决我看到的大部分问题。
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 文件。否则,如果任何其他文件类型在您搜索的目录之一中并且您 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()
什么都不做。
我想使用 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))
- 名称错误
您导入了 SeqIO 但正在调用 seqIO.convert()。 Python 区分大小写。该行应为:
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
.
这段代码应该可以解决我看到的大部分问题。
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 文件。否则,如果任何其他文件类型在您搜索的目录之一中并且您 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()
什么都不做。