我有一个文本文件:
>name_1
data_1
>name_2
data_2
>name_3
data_3
>name_4
data_4
>name_5
data_5
我想将标题(name_1
,name_2
....)存储在一个列表中,并将数据(data_1
,data_2
....)存储在另一个列表中在Python程序中。
def parse_fasta_file(fasta):
desc=[]
seq=[]
seq_strings = fasta.strip().split('>')
for s in seq_strings:
if len(s):
sects = s.split()
k = sects[0]
v = ''.join(sects[1:])
desc.append(k)
seq.append(v)
for l in sys.stdin:
data = open('D:\python\input.txt').read().strip()
parse_fasta_file(data)
print seq
这是我试过的代码,但我无法得到答案。
答案 0 :(得分:0)
最根本的错误是尝试访问其范围之外的变量。
def function (stuff):
seq = whatever
function('data')
print seq ############ error
您无法在seq
之外访问function
。通常的方法是让function
返回一个值,并将其捕获到调用者中的变量中。
def function (stuff):
seq = whatever
return seq
s = function('data')
print s
(我故意在函数内外使用不同的变量名。在function
内,您无法访问s
或data
,而在外部,您无法访问stuff
或seq
。顺便说一句,对于初学者来说,在主线代码中使用同名seq
的其他变量会很麻烦,但这会让人感到困惑。)
有了这个,我们可以尝试编写一个函数,它返回一个序列列表和一个描述列表。
def parse_fasta (lines):
descs = []
seqs = []
data = ''
for line in lines:
if line.startswith('>'):
if data: # have collected a sequence, push to seqs
seqs.append(data)
data = ''
descs.append(line[1:]) # Trim '>' from beginning
else:
data += line.rstrip('\r\n')
# there will be yet one more to push when we run out
seqs.append(data)
return descs, seqs
这不是特别优雅,但应该让你开始。更好的设计是返回一个(描述,数据)元组列表,其中描述及其数据紧密耦合在一起。
descriptions, sequences = parse_fasta(open('file', 'r').read().split('\n'))
代码中的sys.stdin
循环似乎没有做任何有用的事情。