IndexError,为什么从if语句求值时列表显示为空



我正在尝试从一个巨大的文件(1GB(中读取,并试图在这样做的同时降低内存使用率。这是我的代码:

with open('abitmorelinesdec.dat') as data_f:
i=0
line=[]
for lines in data_f:
i=i+1
line = np.array(list(filter(None,lines.strip().split(' ')))[4:],dtype=int)
if line[4] == 0:
print('ok')

它确实输出以下内容:

if line[4] == 0:
IndexError: index 4 is out of bounds for axis 0 with size 0

如果我试着运行这个:

with open('abitmorelinesdec.dat') as data_f:
i=0
line=[]
for lines in data_f:
i=i+1
line = np.array(list(filter(None,lines.strip().split(' ')))[4:],dtype=int)
if i==100:
print(line) 
print(len(line))

Spyder输出:

[3459 3458 3457 ... 3464 3460 3464]
1024

这表明python正确地将行视为在if语句声明前"片刻"包含1024个元素的列表。我在这里缺少什么?

你可以在这里找到文件的一小部分:https://pastebin.com/FPFWAsxP

提前非常感谢

让我们看看您的行读取代码对您读取的行做了什么:

>>> line = np.array(list(filter(None,"0 1 2 3 4 5 6 7 8 9 10".strip().split(' ')))[4:],dtype=int)
>>> line[4]
8

是的,它工作正常。结论:您的输入文件有一些空行或短行。你为什么不循环打印每一行的长度,你会自己看到的。

with open('abitmorelinesdec.dat') as data_f:
for inpline in data_f:
print(len(np.array(list(filter(None,inpline.strip().split(' ')))[4:],dtype=int)))

这不是答案。但这是编写可能指向问题所在的代码的最简单方法。它将为您提供更多关于违规行所在位置的信息。

with open('abitmorelinesdec.dat') as data_f:
i=0
line=[]
for lines in data_f:
i=i+1
line = np.array(list(filter(None,lines.strip().split(' ')))[4:],dtype=int)
try:
fifth_element = line[4]
except IndexError:
print(f"error at line {i}")
print(line)
raise IndexError
if fifth_element == 0:
print('ok')

最新更新