IndexError: список индексов вне диапазона в CSV-файле, читающем python

У меня есть файл csv, содержащий 30000000 записей. как это

കൃഷി 3
വ്യാപകമാകുന്നു 2
നെല്‍കൃഷി 2
വെള്ളം 2
നെല്ല് 2
മാത്രമേ 2
ജല 2

Когда я пытаюсь изменить порядок слов, я получаю следующую ошибку

Traceback (most recent call last):
  File "/home//grpus/dg.py", line 8, in <module>
    writer.writerow((row[1], row[0]))
IndexError: list index out of range

Это код:

import csv

with open('s.csv', 'rb') as f:
    reader = csv.reader(f, delimiter='\t')
    with open("revmal.txt", "w") as o:
        writer = csv.writer(o, delimiter='\t')
        for row in reader:
            writer.writerow((row[1], row[0]))

Редактировать

 writer.writerow(row[::-1])

Когда я пытаюсь это исправить

Как исправить эту ошибку?

 Traceback (most recent call last):
      File "/home/grpus/dg.py", line 7, in <module>
        for row in reader:
    Error: field larger than field limit (131072)

Размер файла 1,4 Gb.

wc -L s.csv

936

{if(length($0)>max){max=length($0);maxline=$0}}END{print maxline} This produced 

������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ����������������!� 1 186 символов


person Community    schedule 05.03.2014    source источник
comment
Это может произойти, если вы наткнулись на пустую строку или когда в одной из ваших строк есть только один столбец; также я понял, что вы просто пишете строку в обратном порядке, почему бы не попробовать writer.writerow(row[::-1])?   -  person Burhan Khalid    schedule 05.03.2014
comment
Каков размер этого файла? (Размер файловой системы).   -  person Burhan Khalid    schedule 05.03.2014
comment
каков результат wc -L s.csv?   -  person Burhan Khalid    schedule 05.03.2014
comment
Хм, что выводит это: awk '{if(length($0)>max){max=length($0);maxline=$0}}END{print maxline}' s.csv? Это очень длинная очередь?   -  person Burhan Khalid    schedule 05.03.2014
comment
В том же формате, что и ваши строки, которые вы вставили сюда?   -  person Burhan Khalid    schedule 05.03.2014
comment
строка, которую вы вставили, не имеет символа табуляции. Я считаю, что ваш разделитель неверен.   -  person Burhan Khalid    schedule 06.03.2014


Ответы (2)


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

У вас есть два варианта:

  1. пропустить строки с меньшим количеством столбцов, чем вам нужно:

    for row in reader:
        if len(row) < 2:
            continue
        writer.writerow((row[1], row[0]))
    
  2. исправьте свой разделитель, чтобы он соответствовал фактическому содержимому файла:

    reader = csv.reader(f, delimiter=' ')
    

    вы можете использовать класс csv.Sniffer(), чтобы попытаться автоматизировать выбор разделителя, если у вас есть более одного файла для обработки, и эти файлы не все используют один и тот же диалект CSV.

person Martijn Pieters    schedule 05.03.2014
comment
Может быть проще просто .split(). - person Burhan Khalid; 05.03.2014
comment
@BurhanKhalid: возможно, но это не решит проблему возможных пустых строк или строк только с 1 столбцом. - person Martijn Pieters; 05.03.2014
comment
У меня просто возникла мысль - почему бы не просто writer.writerow(row[::-1]), поскольку идея состоит в том, чтобы изменить порядок столбцов на противоположный. - person Burhan Khalid; 05.03.2014
comment
@MartijnPieters Я думаю, что проблема связана с большим количеством записей в файле csv. В маленьких файлах работает отлично. - person ; 05.03.2014
comment
@karu: Это совсем не проблема для модуля csv, который обрабатывает ваш файл построчно. - person Martijn Pieters; 05.03.2014
comment
@MartijnPieters Хорошо, хорошо - person ; 05.03.2014
comment
@karu: Это действительно другая ошибка, и одна из ваших строк слишком длинная. По крайней мере, одна строка длиннее 128 КБ, это слишком много. - person Martijn Pieters; 05.03.2014

Поскольку все, что вы хотите сделать, это записать файл в обратном порядке, просто запишите ту же строку назад, но в обратном порядке; как это:

 writer.writerow(row[::-1])

Отрицательный индекс начинается справа, а отрицательное значение шага (третий аргумент в синтаксисе слайса) просто инвертирует объект.

Это остановит ошибку, которую вы видите сейчас, и если у вас есть столбцы строк, которые не равны 2, они также будут записаны в обратном порядке.

person Burhan Khalid    schedule 05.03.2014
comment
Трассировка (последний последний вызов): файл /home/akallararajappan/corpus/dg.py, строка 7, в ‹module› для строки в считывателе: ошибка: поле больше предела поля (131072) - person ; 05.03.2014
comment
Есть ли в вашем файле символы кавычек? Попробуйте прочитать его с quoting=csv.QUOTE_NONE, если это не поможет - добавьте csv.field_size_limit(sys.maxsize) перед оператором with (не забудьте сначала import sys). - person Burhan Khalid; 05.03.2014
comment
@BurhanKhalid: я подозреваю, что что-то еще не так с реальным файлом, когда OP должен обрабатывать строки размером 128 КБ. - person Martijn Pieters; 05.03.2014
comment
Martijn, может быть, это проблема с кодировкой? - person Burhan Khalid; 05.03.2014
comment
@BurhanKhalid: если используется кодировка UTF, я так не думаю. - person Martijn Pieters; 05.03.2014