收到 NameError - 如何解决?
Receiving NameError - how to fix?
我正在做一个项目,我在 nano
中编写的以下代码有问题:
from Bio import SeqIO
import sys
import re
fasta_file = (sys.argv[1])
for myfile in SeqIO.parse(fasta_file, "fasta"):
if len(myfile) > 250:
gene_id = myfile.id
list = re.match('H149xcV\_\w+\_\w+\_\w+', gene_id)
print (">"+list.group(1))
这是我在 command-line
上执行命令时收到的错误:
File "mpo.py", line 7, in <module>
gene_id = myfile.id
NameError: name 'myfile' is not defined
我有一个格式为
的fasta文件
>H149xcV_Fge342_r3_h2_d1 len=210 path=[0:0-206]
ACTATACATGAGGAGAACATAGAACAAAAATGGGACCATAGATATATAACAATAGAAGATATAGAGAACACAATAGACAACTTATTAGGAAAGAGGTGTGTCGTCATGGAGCTGATGTTCGAGGATACTTTGCATGGTCATTCTTGGATAATTTTGAGTGGGCTATGGGATACACCAAGAGGTTTGGCATTGTTTATGTTGATTATAAGAACGGGC
>H149xcV_ytR1oP_r3_h2_d1 len=306 path=[0:0-207]
ATTAGAGTCTGAGAGAGTCTTGATTTGTCGTCGTCGAGAAATATAGGAGATCTGATTAGAGGAGAGAGCGGCCTAGGCGATGCGCGATATAGCGCTATATAGGCCTAGAGGAGAGTCTCTCTCTTTTAGAAGAGATAATATATATATATATATGGCTCTCCGGCGGGGCCGCGCGAGAGCTCGATCGATCGATATTAGCTGTACGATGCTAGCTAGCTTATATTCGATCGATTATAGCTTAGATCTCTCTCTAAAGGTCGATATCGCTTATGCGCGCGTATATCG
我想重新格式化我的文件,以便它只为我提供唯一的基因 ID,并且只输出那些长度大于 250 bp 的基因 ID。
我希望我想要的输出如下所示:
>H149xcV_Fge342_r3_h2
>H149xcV_ytR1oP_r3_h2
>H149xcV_DPN78333_r3_h2
>H149xcV_AgV472_r3_h2
>H149xcV_DNP733_r3_h2
使用 EMBOSS
包中的 infoseq
实用程序,并使用您选择的脚本语言通过单行管道输出(带有序列 ID 和长度的 table)。在这里,为了简单起见,我使用 Perl:
cat input.fasta | \
infoseq -auto -only -name -length stdin | \
perl -lane 'my ($name, $length) = @F; if ( !$seen{$name}++ && $length > 250 ) { print ">$name"; }' > output.fasta
安装EMBOSS
,例如,使用conda
:
conda create --name emboss emboss
正如您问题后的评论中所建议的,要匹配的参数应该是一个字符串。我要补充的一件事是 python3 有一个用于正则表达式的 r"" 字符串定界符。你的代码变成这样:
from Bio import SeqIO
import sys
import re
fasta_file = (sys.argv[1])
for myfile in SeqIO.parse(fasta_file, "fasta"):
if len(myfile) > 250:
gene_id = myfile.id
list = re.match(r"H149xcV_\w+_\w+_\w+", gene_id)
print (">"+list.group(0))
下划线 _ 不是特殊的正则表达式字符(我记得)所以不需要转义。
match()
函数采用正则表达式和您正在搜索的字符串(因此我添加了 gene_id)。最后,你要输出group(0)
。 group(0) 表示整场比赛。 group(1) 来自第一个捕获的 paren(其中你有 none)所以坚持使用 group(0).
我正在做一个项目,我在 nano
中编写的以下代码有问题:
from Bio import SeqIO
import sys
import re
fasta_file = (sys.argv[1])
for myfile in SeqIO.parse(fasta_file, "fasta"):
if len(myfile) > 250:
gene_id = myfile.id
list = re.match('H149xcV\_\w+\_\w+\_\w+', gene_id)
print (">"+list.group(1))
这是我在 command-line
上执行命令时收到的错误:
File "mpo.py", line 7, in <module>
gene_id = myfile.id
NameError: name 'myfile' is not defined
我有一个格式为
的fasta文件>H149xcV_Fge342_r3_h2_d1 len=210 path=[0:0-206]
ACTATACATGAGGAGAACATAGAACAAAAATGGGACCATAGATATATAACAATAGAAGATATAGAGAACACAATAGACAACTTATTAGGAAAGAGGTGTGTCGTCATGGAGCTGATGTTCGAGGATACTTTGCATGGTCATTCTTGGATAATTTTGAGTGGGCTATGGGATACACCAAGAGGTTTGGCATTGTTTATGTTGATTATAAGAACGGGC
>H149xcV_ytR1oP_r3_h2_d1 len=306 path=[0:0-207]
ATTAGAGTCTGAGAGAGTCTTGATTTGTCGTCGTCGAGAAATATAGGAGATCTGATTAGAGGAGAGAGCGGCCTAGGCGATGCGCGATATAGCGCTATATAGGCCTAGAGGAGAGTCTCTCTCTTTTAGAAGAGATAATATATATATATATATGGCTCTCCGGCGGGGCCGCGCGAGAGCTCGATCGATCGATATTAGCTGTACGATGCTAGCTAGCTTATATTCGATCGATTATAGCTTAGATCTCTCTCTAAAGGTCGATATCGCTTATGCGCGCGTATATCG
我想重新格式化我的文件,以便它只为我提供唯一的基因 ID,并且只输出那些长度大于 250 bp 的基因 ID。
我希望我想要的输出如下所示:
>H149xcV_Fge342_r3_h2
>H149xcV_ytR1oP_r3_h2
>H149xcV_DPN78333_r3_h2
>H149xcV_AgV472_r3_h2
>H149xcV_DNP733_r3_h2
使用 EMBOSS
包中的 infoseq
实用程序,并使用您选择的脚本语言通过单行管道输出(带有序列 ID 和长度的 table)。在这里,为了简单起见,我使用 Perl:
cat input.fasta | \
infoseq -auto -only -name -length stdin | \
perl -lane 'my ($name, $length) = @F; if ( !$seen{$name}++ && $length > 250 ) { print ">$name"; }' > output.fasta
安装EMBOSS
,例如,使用conda
:
conda create --name emboss emboss
正如您问题后的评论中所建议的,要匹配的参数应该是一个字符串。我要补充的一件事是 python3 有一个用于正则表达式的 r"" 字符串定界符。你的代码变成这样:
from Bio import SeqIO
import sys
import re
fasta_file = (sys.argv[1])
for myfile in SeqIO.parse(fasta_file, "fasta"):
if len(myfile) > 250:
gene_id = myfile.id
list = re.match(r"H149xcV_\w+_\w+_\w+", gene_id)
print (">"+list.group(0))
下划线 _ 不是特殊的正则表达式字符(我记得)所以不需要转义。
match()
函数采用正则表达式和您正在搜索的字符串(因此我添加了 gene_id)。最后,你要输出group(0)
。 group(0) 表示整场比赛。 group(1) 来自第一个捕获的 paren(其中你有 none)所以坚持使用 group(0).