Python-错误字符串索引超出范围

时间:2013-08-21 16:08:03

标签: python

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 个答案:

答案 0 :(得分: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)==0替换为elif not line

答案 1 :(得分: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('>')

答案 2 :(得分:0)

line.rstrip('\n')

返回行的副本,并且不对它执行任何操作。它不会改变“线”。

异常“IndexError:字符串索引超出范围”意味着无法引用“line [0]” - 因此“line”必须为空。也许你应该这样做:

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

答案 3 :(得分: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

由于未保存rstrip的返回值,因此您在str.rstrip('\n')附近的行未执行任何操作。