我使用以下语法在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
发生了什么事?
答案 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)
进入循环之前fileIndex
的价值是多少?
检查字符串的结尾(if fileIndex == lengthOfFile:
)是否在if file[fileIndex] == ';':
内,所以如果字符串中没有;
,则实际上会有无限循环。
使用字符的操作不是非常pythonic,最有可能更有效的工具来做你的事情(如.index
方法str
等等。)