我有以下代码:
import fileinput
import sys
import re
def reading_fasta(fasta):
#### defining variables
name = ""
hashseq = {}
sequence = ""
### loop over file
for line in fileinput.input(fasta):
if not line:
hashseq[name] = sequence
fileinput.close()
break
elif re.match("^>.*", line):
if fileinput.lineno() != 1:
hashseq[name] = sequence
del sequence
name = re.split('\W+', line)[1]
else:
line.rstrip("\n")
sequence += line
reading_fasta(sys.argv[1])
出现以下错误:
Traceback (most recent call last):
File "parse.py", line 25, in <module>
reading_fasta(sys.argv[1])
File "parse.py", line 23, in reading_fasta
sequence += line
UnboundLocalError: local variable 'sequence' referenced before assignment
为什么?在网上冲浪我发现了相同的错误,但由于变量是在全球环境中设置的。尽管如此,我的变量在函数内部定义为局部变量。
答案 0 :(得分:1)
你删除变量;这取消了这个名字。
del sequence
不要那样做;将其重新绑定为空字符串,可能是:
sequence = ''
请注意,首先在列表中收集字符串,然后与str.join()
一起连接,效率更高:
def reading_fasta(fasta):
hashseq = {}
with open(fasta) as inf:
sequence = []
name = ''
for line in inf:
if re.match("^>.*", line):
if sequence:
hashseq[name] = ''.join(sequence)
sequence = []
name = re.split('\W+', line)[1]
else:
sequence.append(line.rstrip('\n'))
if sequence:
# remainder
hashseq[name] = ''.join(sequence)
return hashseq
我已经重新编写了一些代码,以便将输入文件对象用作上下文管理器(因此它会自动关闭)。循环文件对象永远不会产生完全空行,检测完文件的最佳方法是在循环完成后处理余数。您根本无需使用fileinput.input()
,因为您只需测试sequence
是否为空。
我还假设你想返回结果字典。 : - )