IndexError: индекс списка вне диапазона печатает только каждую вторую строку в python

У меня есть текстовый файл, который я хотел бы ввести построчно в python. Мой текстовый файл с разделителями табуляции:

    0.227996254681648   0.337028824833703   0.238163571416268   0.183009231781289   0.085746697332588   0.13412895376826
    0.247891283973758   0.335555555555556   0.272129379268419   0.187328622765857   0.085921240923626   0.128372465534807
    0.264761012183693   0.337777777777778   0.245917821271498   0.183211905363232   0.080493183753814   0.122786059549795
    0.30506091846298    0.337777777777778   0.204265153911403   0.208453197418743   0.0715575291087 0.083682658454807
    0.222748815165877   0.337028824833703   0.209714942778068   0.084252659537679   0.142013573559938   0.234672985858848

Я хотел бы читать в каждой строке, а затем печатать только 6-й столбец. Это работает довольно хорошо с этим кодом:

with open('path/mytextfile.txt') as f:
    for line in f:
        header1 = f.readline()
        line = line.strip()
        columns = line.split()
        jmag = columns[5]
        print(jmag)
        if 'str' in line:
            break

Он печатает 6-й столбец, который я хочу, но печатает только каждую вторую строку:

0.13412895376826
0.122786059549795
0.234672985858848
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-63-98c7449902b9> in <module>
      4         line = line.strip()
      5         columns = line.split()
----> 6         jmag = columns[5]
      7         print(jmag)
      8         if 'str' in line:

IndexError: list index out of range

В чем здесь ошибка?

в вашем цикле вы звоните f.readline() - таким образом пропуская каждую вторую строку

Mike Scotty 22.03.2022 00:55

И for line in f, и f.readline() перемещают указатель файла; вы, вероятно, хотели прочитать «заголовок» вне цикла (если вообще в вашем примере нет заголовка).

Grismar 22.03.2022 00:55
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
28
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

ты не можешь сделать что-то вроде

f = open("file.txt")
lines = readlines(f)
for line in lines:
    print(line.split()[5])
f.close()

это должно взять каждую строку и разделить их на 6 разных чисел, а затем напечатать 5-е число в списке (которое является шестым числом)

readlines(f) действительно работает? Из всех примеров, которые я знаю, это всегда f.readlines()

kenntnisse 22.03.2022 01:09

Извините, это опечатка, это f.readlines()

KingTasaz 22.03.2022 06:01
Ответ принят как подходящий

Проблема с вашим кодом в том, что вы делаете for line in f:, но также и header1 = f.readline(). for line in f: проходит через каждую строку, но header1 = f.readline() удаляет следующую строку (и сохраняет ее в header1). Все, что вам нужно сделать, это удалить header1 = f.readline().

Вы также можете быть немного менее многословным в коде, выполнив

with open("path/mytextfile.txt") as f:
    for line in f:
        columns = line.strip().split()
        if 'str' in line:
            break
        print(columns[5])

но это не имеет большого значения.

Я считаю, что ошибка индекса происходит потому, что for line in f: узнает, сколько итераций ему нужно пройти, но f меняет размер. Как правило, изменять размер list или файла во время просмотра — плохая идея.

Другие вопросы по теме