0
f=open('sequence3.fasta', 'r')
str=''

for line in f:
    line2=line.rstrip('\n')
    if (line2[0]!='>'):
        str=str+line2
    elif (len(line)==0):
        break

str.rstrip('\n') 
f.close()

该脚本假设读取 3 个 DNA 序列并将它们连接到一个序列。问题是,我收到此错误:

IndexError: string index out of range

当我这样写时:

f=open('sequence3.fasta', 'r')
str=''

for line in f:
    line.rstrip('\n')
    if (line[0]!='>'):
        str=str+line
    elif (len(line)==0):
        break

str.rstrip('\n') 
f.close()

它运行,但中间有空格。谢谢

4

4 回答 4

2

第二个版本不会崩溃,因为该行line.rstrip('\n')是 NOOP。rtrip返回一个新字符串,并且不修改现有字符串 ( line)。第一个版本崩溃是因为您的输入文件中可能有空行,因此line.rstrip返回一个空行。尝试这个:

f=open('sequence3.fasta', 'r')
str=''

for line in f:
    line2=line.rstrip('\n')
    if line2 and line2[0]!='>':
        str=str+line2
    elif len(line)==0:
        break

if line2等价于if len(line2) > 0。同样,您可以将您的替换elif len(line)==0elif not line.

于 2013-08-21T16:13:14.413 回答
0

您的空行条件位于错误的位置。尝试:

for line in f:
    line = line.rstrip('\n')

    if len(line) == 0: # or simply: if not line:
        break

    if line[0] != '>':
        str=str+line

或者另一种解决方案是使用.startswithif not line.startswith('>')

于 2013-08-21T16:13:55.207 回答
0
line.rstrip('\n')

返回行的副本,您什么也不做。它不会改变“线”。

异常“IndexError: string index out of range”意味着“line[0]”不能被引用——所以“line”必须为空。也许你应该这样做:

for line in f:
    line = line.rstrip('\n')
    if line:
        if (line[0]!='>'):
            str=str+line
    else:
        break
于 2013-08-21T16:16:53.967 回答
0

您不应该使用不保存 rstrip 的返回值的第二个代码示例。rstrip 不会修改使用它的原始字符串。RStrip - Return a copy of the string with trailing characters removed..

同样在您的 if else 语句中,您检查的第一个条件应该是长度 0,否则检查字符串长度会出错。

此外,如果您有一个空行,则在 if else 语句中中断会提前结束您的循环。如果长度为 0,您就不能做任何事情,而不是破坏。

if (len(line2) != 0):
    if (line2[0] != '>'):
        str = str+line2

此外str.rstrip('\n'),由于未保存 rstrip 的返回值,因此您在末尾附近的行也没有做任何事情。

于 2013-08-21T16:18:17.057 回答