IndexError, почему список выглядит пустым при вычислении из оператора if? - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь читать из огромного файла (1 ГБ) и пытаюсь сэкономить при этом использование памяти.Это мой код:

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 корректно обрабатывает строку как список с 1024 элементами всего за мгновение до объявления оператора if.Что мне здесь не хватает?

Вы можете найти часть файла здесь: https://pastebin.com/FPFWAsxP

Заранее большое спасибо

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

это не является ответом .но это самый простой способ написать код, который может указывать на вашу проблему.это даст вам больше информации о том, где находится оскорбительная линия.

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')
0 голосов
/ 13 декабря 2018

Давайте посмотрим, что ваш код чтения строки делает с прочитанными вами строками:

>>> 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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...