IndexError: daftar indeks di luar jangkauan dalam pembacaan file CSV python

Saya memiliki file csv yang berisi 30.000.000 entri. seperti ini

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

Ketika saya mencoba membalikkan urutan kata saya mendapatkan kesalahan berikut

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

Ini kodenya:

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]))

Sunting

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

Ketika saya mencoba memperbaikinya

Bagaimana cara memperbaiki kesalahan ini?

 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)

Filenya berukuran 1,4 Gb

wc -L s.csv

936

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

������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ������������������������������������������������������ ����������������!� 1, 186 karakter


person Community    schedule 05.03.2014    source sumber
comment
Hal ini dapat terjadi ketika Anda menemukan baris kosong, atau ketika salah satu baris Anda hanya memiliki satu kolom; Saya juga menyadari Anda hanya menulis baris secara terbalik, mengapa tidak mencoba writer.writerow(row[::-1])?   -  person Burhan Khalid    schedule 05.03.2014
comment
Berapa ukuran file ini? (Ukuran sistem file).   -  person Burhan Khalid    schedule 05.03.2014
comment
apa keluaran dari wc -L s.csv?   -  person Burhan Khalid    schedule 05.03.2014
comment
Hrmm, apa outputnya ini: awk '{if(length($0)>max){max=length($0);maxline=$0}}END{print maxline}' s.csv? Apakah antreannya sangat panjang?   -  person Burhan Khalid    schedule 05.03.2014
comment
Dalam format yang sama dengan baris yang Anda tempel di sini?   -  person Burhan Khalid    schedule 05.03.2014
comment
baris yang Anda tempel, tidak memiliki karakter tab. Saya yakin pembatas Anda salah.   -  person Burhan Khalid    schedule 06.03.2014


Jawaban (2)


Anda memiliki setidaknya satu baris yang tidak memiliki 2 kolom yang dipisahkan oleh sebuah tab. Baris kosong, misalnya, atau jika format Anda sebenarnya tidak menggunakan tab.

Anda memiliki dua opsi:

  1. lewati baris dengan kolom lebih sedikit dari yang Anda butuhkan:

    for row in reader:
        if len(row) < 2:
            continue
        writer.writerow((row[1], row[0]))
    
  2. perbaiki pembatas Anda agar sesuai dengan konten file sebenarnya:

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

    Anda dapat menggunakan csv.Sniffer() class untuk mencoba dan mengotomatiskan pemilihan pembatas, jika Anda memiliki lebih dari satu file untuk diproses, dan tidak semua file tersebut mengikuti dialek CSV yang sama.

person Martijn Pieters    schedule 05.03.2014
comment
Mungkin lebih mudah untuk hanya .split(). - person Burhan Khalid; 05.03.2014
comment
@BurhanKhalid: mungkin, tapi itu tidak akan menyelesaikan masalah kemungkinan baris kosong atau baris dengan 1 kolom saja. - person Martijn Pieters; 05.03.2014
comment
Saya baru saja berpikir - mengapa tidak writer.writerow(row[::-1]) saja karena idenya adalah membalikkan urutan kolom. - person Burhan Khalid; 05.03.2014
comment
@MartijnPieters Saya rasa masalahnya adalah karena banyaknya entri dalam file csv. Dalam file kecil ini berfungsi dengan sempurna. - person ; 05.03.2014
comment
@karu: Itu sama sekali bukan masalah untuk modul csv, yang memproses file Anda baris demi baris. - person Martijn Pieters; 05.03.2014
comment
@MartijnPieters Oke, baiklah - person ; 05.03.2014
comment
@karu: Itu memang kesalahan yang berbeda, dan salah satu baris Anda terlalu panjang. Setidaknya satu baris lebih panjang dari 128kb, itu terlalu besar. - person Martijn Pieters; 05.03.2014

Karena yang ingin Anda lakukan hanyalah menulis file dalam urutan terbalik, cukup tulis kembali baris yang sama, tetapi secara terbalik; seperti ini:

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

Indeks negatif dimulai dari kanan, dan nilai langkah negatif (argumen ketiga dalam sintaksis irisan) hanya akan membalikkan objek.

Ini akan menghentikan kesalahan yang Anda lihat sekarang, dan jika Anda memiliki kolom baris yang bukan 2, kolom tersebut juga akan ditulis terbalik.

person Burhan Khalid    schedule 05.03.2014
comment
Traceback (panggilan terakhir terakhir): File /home/akallararajappan/corpus/dg.py, baris 7, di ‹module› untuk baris di pembaca: Kesalahan: bidang lebih besar dari batas bidang (131072) - person ; 05.03.2014
comment
Apakah Anda memiliki karakter kutipan di file Anda? Coba baca dengan quoting=csv.QUOTE_NONE, jika ini tidak menyelesaikan masalah - tambahkan csv.field_size_limit(sys.maxsize) sebelum pernyataan with Anda (jangan lupa import sys terlebih dahulu). - person Burhan Khalid; 05.03.2014
comment
@BurhanKhalid: Saya curiga ada yang salah dengan file sebenarnya ketika OP harus menangani baris 128kb.. - person Martijn Pieters; 05.03.2014
comment
Martijn, mungkinkah ini masalah penyandian? - person Burhan Khalid; 05.03.2014
comment
@BurhanKhalid: jika pengkodean UTF digunakan, saya rasa tidak. - person Martijn Pieters; 05.03.2014