索引超出范围错误(从文件中读取的数组)
Posted
技术标签:
【中文标题】索引超出范围错误(从文件中读取的数组)【英文标题】:Index out of range error (From array that is read off of a file) 【发布时间】:2015-02-28 00:33:20 【问题描述】:我正在尝试计算列表中存在多少特定字符串(在本例中为“v”)。 但是当我运行代码时,它给了我索引超出范围的错误。 列表由 line.split() 方法创建
这就是我所拥有的:
for line in open('cube.obj','r').readlines():
rawdata = line.split()[0:]
data = line.split()[1:]
obj.add_last(data)
if rawdata[0] == 'v':
v_count += 1
cube.obj 文件如下:
# cube
v 0.0 0.0 0.0
v 1.0 0.0 0.0
v 1.0 0.0 1.0
v 0.0 0.0 1.0
v 0.0 1.0 1.0
v 0.0 1.0 0.0
v 1.0 1.0 0.0
v 1.0 1.0 1.0
f 1 2 3 4
f 6 7 8 5
f 2 3 8 7
f 1 4 5 6
f 3 4 5 8
f 1 2 7 6
感谢任何帮助 谢谢!
【问题讨论】:
没有看到一些输入或回溯是不可能帮助的 如果我们知道obj
是什么以及它的add_last()
方法应该做什么,那就太好了。
输入文件中的空行可能会出现此错误。
OP:您是否尝试过为此使用collections.Counter
?
每当我删除 obj.add_last() 时,仍然会出现同样的错误。所以我认为是 if 语句造成了麻烦
【参考方案1】:
如果您收到 Index out of range 错误,那是因为您正在引用一个不存在的列表条目。
在你的情况下,这看起来很可能是rawdata[0] == 'v'
如果 rawdata 是一个空列表,这将导致错误。如果您的行是空字符串,就会发生这种情况。
line = ''
rawdata=line.split()[0:]
rawdata
> []
rawdata[0]
> ---------------------------------------------------------------------------
> IndexError Traceback (most recent call last)
> <ipython-input-4-c81248904650> in <module>()
> ----> 1 rawdata[0]
> IndexError: list index out of range
要跳过此,请测试该行是否为空,如果是,请continue
到下一行。
for line in ['', '', 'a', 'b']:
if not line:
continue
rawdata = line.split()[0:]
print rawdata[0]
> a
> b
【讨论】:
谢谢。文件中有一个空行。有什么办法可以让我忽略一个空列表并计算'v'? 已编辑以显示如何continue
(即,跳过其余语句并转到循环中的下一步)
好的,谢谢,我明白了。但是 continue 方法对我的情况有效吗?我已经编辑了我的帖子,所以我可以告诉你我想要做什么。
查看continue
的工作原理***.com/questions/8420705/… 它适用于您的情况。【参考方案2】:
您可以使用生成器表达式 sum
使用 if line.strip()
捕获空行,因为我们不会得到 IndexError
索引空列表:
def counts(f,ch):
with open(f) as in_file:
return sum(line.split()[0] == ch for line in in_file if line.strip())
print(counts("words.txt","v"))
8
if line.strip()
只会在该行不为空时为 True。
【讨论】:
以上是关于索引超出范围错误(从文件中读取的数组)的主要内容,如果未能解决你的问题,请参考以下文章
为啥在使用 readlines() 读取文件时出现列表索引超出范围错误?