IndexError: รายการดัชนีอยู่นอกช่วงในไฟล์ CSV ที่อ่านหลาม

ฉันมีไฟล์ 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)


คุณมีอย่างน้อยหนึ่งแถวที่ไม่มี 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() class เพื่อลองเลือกตัวคั่นอัตโนมัติ หากคุณมีไฟล์ที่ต้องดำเนินการมากกว่าหนึ่งไฟล์ และไฟล์เหล่านี้ไม่ได้ใช้ภาษา 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: นั่นเป็นข้อผิดพลาดที่แตกต่างออกไปจริงๆ และหนึ่งในบรรทัดของคุณยาวเกินไป อย่างน้อยหนึ่งบรรทัดยาวเกิน 128kb ซึ่งใหญ่เกินไป - person Martijn Pieters; 05.03.2014

เนื่องจากสิ่งที่คุณต้องการทำคือเขียนไฟล์ในลำดับย้อนกลับ เพียงแค่เขียนแถวเดียวกันกลับ แต่กลับกัน แบบนี้:

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

ดัชนีเชิงลบเริ่มต้นจากด้านขวา และค่าขั้นตอนที่เป็นลบ (อาร์กิวเมนต์ที่สามในรูปแบบไวยากรณ์ของสไลซ์) จะกลับรายการวัตถุ

การดำเนินการนี้จะหยุดข้อผิดพลาดที่คุณเห็นในขณะนี้ และในกรณีที่คุณมีแถวคอลัมน์ที่ไม่ใช่ 2 คอลัมน์เหล่านั้นจะถูกเขียนแบบย้อนกลับด้วย

person Burhan Khalid    schedule 05.03.2014
comment
Traceback (การโทรล่าสุดครั้งล่าสุด): ไฟล์ /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 ต้องจัดการบรรทัด 128kb .. - person Martijn Pieters; 05.03.2014
comment
Martijn นี่อาจเป็นปัญหาการเข้ารหัสใช่ไหม - person Burhan Khalid; 05.03.2014
comment
@BurhanKhalid: หากใช้การเข้ารหัส UTF ฉันไม่คิดอย่างนั้น - person Martijn Pieters; 05.03.2014