Loop - String Index超出范围?

时间:2016-04-17 20:29:28

标签: python while-loop

我使用以下语法在Python中运行while循环:

while not endFound:
    if file[fileIndex] == ';':
        current = current + ';'
        contents.append(current)
        if fileIndex == lengthOfFile:
            endFound = True
    else:
        current = current + file[fileIndex]
    fileIndex = fileIndex + 1

我在控制台中收到此错误:

var(vari) = 0;terminal.write(vari);var(contents) = file.getContents('source.py');if(vari : 0) {    terminal.write('vari equals 0');}
Traceback (most recent call last):
  File "/home/ubuntu/workspace/source.py", line 30, in <module>
    splitFile(content)
  File "/home/ubuntu/workspace/source.py", line 22, in splitFile
    if file[fileIndex] == ';':
IndexError: string index out of range

> Process exited with code: 1

发生了什么事?

2 个答案:

答案 0 :(得分:2)

我假设你在开始之前有这样的事情:

file = "section_1;section_2;section_3;"
lengthOfFile = len(file)
contents = []
current = ""
fileIndex = 0
endFound = False

您编写的代码可以稍微澄清如下:

while not endFound:
    next_char = file[fileIndex]
    current = current + next_char
    if next_char == ';':
        contents.append(current)
        #? current = ''
        if fileIndex == lengthOfFile:
            endFound = True
    fileIndex = fileIndex + 1

此特定情况下的问题是,当您到达;中的最终file时,fileIndex为17,但lengthOfFile为18.所以{{1测试失败。您可以通过将此行更改为fileIndex == lengthOfFile,或将增量操作移至fileIndex + 1 == lengthOfFile上方来修复上述代码。

但是有更简单的方法可以用Python编写这段代码。特别是,如果您的目标是if next_char == ';'成为所有“section_n”的列表contents中的条目,您可以使用以下内容:

file

contents = [part + ';' for part in file[:-1].split(';')] 在分割之前省略[:-1]中的最后一个字符(;)。)请注意,如果这是您想要的,那么您的原始代码也需要重置如上所述,每次通过期间file的值。

如果你真的希望current成为contents开头的更长和更长子串的列表,就像目前所写的那样,你可以这样做:

file

答案 1 :(得分:1)

  1. 进入循环之前fileIndex的价值是多少?

  2. 检查字符串的结尾(if fileIndex == lengthOfFile:)是否在if file[fileIndex] == ';':内,所以如果字符串中没有;,则实际上会有无限循环。

  3. 使用字符的操作不是非常pythonic,最有可能更有效的工具来做你的事情(如.index方法str等等。)