_csv.Error: ฟิลด์ที่มีขนาดใหญ่กว่าขีด จำกัด ของฟิลด์ (131072)


232

ฉันมีสคริปต์อ่านในไฟล์ csv ที่มีฟิลด์ขนาดใหญ่มาก:

# example from http://docs.python.org/3.3/library/csv.html?highlight=csv%20dictreader#examples
import csv
with open('some.csv', newline='') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

อย่างไรก็ตามสิ่งนี้จะโยนข้อผิดพลาดต่อไปนี้ในไฟล์ csv บางไฟล์:

_csv.Error: field larger than field limit (131072)

ฉันจะวิเคราะห์ไฟล์ csv ด้วยฟิลด์ขนาดใหญ่ได้อย่างไร การข้ามบรรทัดที่มีฟิลด์ขนาดใหญ่ไม่ใช่ตัวเลือกเนื่องจากต้องวิเคราะห์ข้อมูลในขั้นตอนถัดไป


10
ยิ่งไปกว่านั้นคือการพิจารณาว่าทำไมมีเขตข้อมูลขนาดใหญ่เช่นนี้คาดว่าเป็นข้อมูลของคุณ บางครั้งข้อผิดพลาดเช่นนี้บ่งบอกถึงปัญหาที่แตกต่าง ฉันมีข้อมูลที่ไม่ดีในเหมืองซึ่งรวมถึงอักขระเครื่องหมายคำพูดคู่แบบสุ่มและต้องใช้ตัวเลือก QUOTE_NONE ที่แสดงในคำตอบอื่นที่นี่
dustmachine

1
ฉันอัปเดตคำถามของฉันเพื่อระบุว่าในกรณีของฉันอาจเกิดช่องขนาดใหญ่ ไม่มีข้อมูลที่ไม่ดีในไฟล์ csv
user1251007

1
@dustmachine สิ่งต่าง ๆ เกิดขึ้นเพราะบางครั้งคุณพบคนที่เก็บภาพ (หรือไฟล์ไบนารีอื่น ๆ ) ในรูปแบบ base64 ในตารางฐานข้อมูล
wintermute

คำตอบ:


315

ไฟล์ csv อาจมีฟิลด์ที่มีขนาดใหญ่มากดังนั้นเพิ่มfield_size_limit:

import sys
import csv

csv.field_size_limit(sys.maxsize)

sys.maxsizeใช้งานได้กับ Python 2.x และ 3.x sys.maxintจะทำงานกับ Python 2.x เท่านั้น ( ดังนั้น: what-is-sys-maxint-in-python-3 )

ปรับปรุง

OverflowError: Python int too large to convert to C longขณะที่เจฟฟ์ชี้ให้เห็นโค้ดข้างต้นอาจส่งผลให้เกิดข้อผิดพลาดต่อไปนี้: เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถใช้รหัสที่รวดเร็วและสกปรกดังต่อไปนี้(ซึ่งควรใช้กับทุกระบบที่มี Python 2 และ Python 3):

import sys
import csv
maxInt = sys.maxsize

while True:
    # decrease the maxInt value by factor 10 
    # as long as the OverflowError occurs.

    try:
        csv.field_size_limit(maxInt)
        break
    except OverflowError:
        maxInt = int(maxInt/10)

14
บน Windows 7 64bit กับงูหลาม 2.6 maxInt = sys.maxsizeผลตอบแทน9223372036854775807Lที่จึงส่งผลให้เมื่อโทรTypeError: limit must be an integer csv.field_size_limit(maxInt)ที่น่าสนใจคือการใช้งานmaxInt = int(sys.maxsize)จะไม่เปลี่ยนแปลงสิ่งนี้ วิธีแก้ปัญหาแบบดิบคือการใช้งานแบบง่ายๆcsv.field_size_limit(2147483647)ซึ่งแน่นอนว่าทำให้เกิดปัญหาในแพลตฟอร์มอื่น ๆ ในกรณีของฉันนี้เป็น adquat เพื่อแจ้งค่าเสียใน CSV ที่แก้ไขตัวเลือกการส่งออกในโปรแกรมอื่น ๆ csv.field_size_limit()และเอาความจำเป็นในการ
roskakori

ขอบคุณมากสำหรับสิ่งนี้ ive พยายามหาจุดบกพร่องนี้มานานแล้ว!
Kevin Hernandez

152

อาจเป็นเพราะไฟล์ CSV ของคุณมีเครื่องหมายคำพูดเดี่ยวหรือคู่ หากไฟล์ CSV ของคุณเป็นตัวคั่นแท็บให้ลองเปิดเป็น:

c = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE)

1
ขอบคุณ!! หากคุณใช้ csvkit (ไพ ธ อนไลบรารี่ที่ยอดเยี่ยมและ command-line csv toolkit) และได้รับข้อผิดพลาดดั้งเดิมเนื่องจากไฟล์ของคุณใช้เครื่องหมายคำพูดเดี่ยวหรือคู่ที่ไม่สมดุลคุณสามารถเลือก QUOTE_NONE ผ่าน-u 3ตัวเลือกบรรทัดคำสั่ง aka--quoting 3
nealmcb

22

ด้านล่างคือการตรวจสอบขีด จำกัด ปัจจุบัน

csv.field_size_limit()

ออก [20]: 131072

ด้านล่างคือการเพิ่มขีด จำกัด เพิ่มไปยังรหัส

csv.field_size_limit(100000000)

ลองตรวจสอบขีด จำกัด อีกครั้ง

csv.field_size_limit()

ออก [22]: 100000000

ตอนนี้คุณจะไม่ได้รับข้อผิดพลาด "_csv.Error: ฟิลด์ที่ใหญ่กว่าขีด จำกัด ของฟิลด์ (131072)"


15

ขนาดฟิลด์csvถูกควบคุมผ่าน[Python 3.Docs]: csv field_size_limit ( [new_limit] ) :

ส่งคืนขนาดฟิลด์สูงสุดในปัจจุบันที่ parser อนุญาต หากได้รับnew_limitสิ่งนี้จะกลายเป็นขีด จำกัด ใหม่

มีการตั้งค่าเริ่มต้นเป็น128kหรือ0x20000 ( 131072 ) ซึ่งควรจะเพียงพอสำหรับ. csv ที่เหมาะสม:

>>> import csv
>>>
>>> limit0 = csv.field_size_limit()
>>> limit0
131072
>>> "0x{0:016X}".format(limit0)
'0x0000000000020000'

อย่างไรก็ตามเมื่อจัดการกับไฟล์. csv ( ด้วยการอ้างอิงที่ถูกต้องและตัวคั่น ) ที่มี (อย่างน้อย) หนึ่งช่องที่ยาวกว่าขนาดนี้ข้อผิดพลาดจะปรากฏขึ้น
เพื่อกำจัดข้อผิดพลาดควรเพิ่มขีด จำกัด ขนาด (เพื่อหลีกเลี่ยงความกังวลใด ๆ พยายามใช้ค่าสูงสุดที่เป็นไปได้)

เบื้องหลัง (ทำเครื่องหมายที่[GitHub]: python / cpython - (หลัก) cpython / Modules / _csv.cสำหรับรายละเอียดการนำไปใช้) ตัวแปรที่เก็บค่านี้คือC long ( [Wikipedia]: C ชนิดข้อมูล ) ขนาดของมันขึ้นอยู่กับสถาปัตยกรรมของCPUและระบบปฏิบัติการ ( I L P ) ความแตกต่างแบบคลาสสิก: สำหรับระบบปฏิบัติการ64 บิต ( บิลด์ไพ ธ อน ) ขนาดแบบยาว (เป็นบิต ) คือ:

  • ห้าม : 64
  • ชนะ : 32

เมื่อพยายามที่จะตั้งค่าใหม่จะถูกตรวจสอบให้อยู่ในขอบเขตที่ยาวนั่นคือสาเหตุที่ในบางกรณีมีข้อยกเว้นอื่นปรากฏขึ้น (กรณีนี้เป็นเรื่องปกติในWin ):

>>> import sys
>>>
>>> sys.platform, sys.maxsize
('win32', 9223372036854775807)
>>>
>>> csv.field_size_limit(sys.maxsize)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C long

เพื่อหลีกเลี่ยงปัญหานี้ให้ตั้งค่าขีด จำกัด (สูงสุดที่เป็นไปได้) ( LONG_MAX ) โดยใช้ข้อต่อ (ขอบคุณ[Python 3.Docs]: ctypes - ไลบรารีฟังก์ชันต่างประเทศสำหรับ Python ) มันควรจะทำงานในหลาม 3และงูหลาม 2 , ที่ใด ๆของ CPU / OS

>>> import ctypes as ct
>>>
>>> csv.field_size_limit(int(ct.c_ulong(-1).value // 2))
131072
>>> limit1 = csv.field_size_limit()
>>> limit1
2147483647
>>> "0x{0:016X}".format(limit1)
'0x000000007FFFFFFF'

64 บิต PythonบนNixเช่นOS :

>>> import sys, csv, ctypes as ct
>>>
>>> sys.platform, sys.maxsize
('linux', 9223372036854775807)
>>>
>>> csv.field_size_limit()
131072
>>>
>>> csv.field_size_limit(int(ct.c_ulong(-1).value // 2))
131072
>>> limit1 = csv.field_size_limit()
>>> limit1
9223372036854775807
>>> "0x{0:016X}".format(limit1)
'0x7FFFFFFFFFFFFFFF'

สำหรับ32bit หลามสิ่งที่มีเครื่องแบบ: มันเป็นพฤติกรรมที่พบในวิน

ตรวจสอบแหล่งข้อมูลต่อไปนี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ:


2

ฉันเพิ่งเกิดเหตุการณ์นี้กับฉันในไฟล์ CSV 'ธรรมดา' บางคนอาจเรียกว่าไฟล์ที่จัดรูปแบบไม่ถูกต้อง ไม่มีอักขระเลี่ยงไม่มีเครื่องหมายอัญประกาศและตัวคั่นเป็นเซมิโคลอน

ตัวอย่างบรรทัดจากไฟล์นี้จะเป็นดังนี้:

เซลล์แรก เซลล์ที่สอง "พร้อมเครื่องหมายคำพูดหนึ่งคู่และพื้นที่ชั้นนำเซลล์ 'ที่ยกมาบางส่วน' เซลล์สุดท้าย

คำพูดเดียวในเซลล์ที่สองจะแยก parser ออกจากราง สิ่งที่ทำงานคือ:

csv.reader(inputfile, delimiter=';', doublequote='False', quotechar='', quoting=csv.QUOTE_NONE)

1

บางครั้งแถวมีคอลัมน์อัญประกาศ เมื่อ csv reader ลองอ่านแถวนี้ไม่เข้าใจจุดสิ้นสุดของคอลัมน์และเริ่มการเพิ่มนี้ โซลูชันอยู่ด้านล่าง:

reader = csv.reader(cf, quoting=csv.QUOTE_MINIMAL)

0

คุณสามารถใช้read_csvจากpandasที่จะข้ามเส้นเหล่านี้

import pandas as pd

data_df = pd.read_csv('data.csv', error_bad_lines=False)

ไม่มีบรรทัดที่ไม่ถูกต้อง ... ดังที่เขียนไว้ในคำถาม: ไฟล์ csv มีฟิลด์ขนาดใหญ่และจำเป็นต้องวิเคราะห์ข้อมูลนี้
user1251007

1
สาย Badแนวคิดในการpandasรวมแถวที่เกินขีด จำกัด csvด้านการ ดังนั้นหากคุณต้องการข้ามบรรทัดเหล่านี้และอ่านบรรทัดอื่นได้สำเร็จคุณอาจใช้วิธีนี้ มิฉะนั้นเมื่อคุณต้องการใช้ฟิลด์ขนาดใหญ่การเพิ่มขีด จำกัด ฟิลด์โดยcsv.field_size_limit(100000000)เหมาะสม
0x01h

-1

ค้นหาไฟล์ cqlshrc ที่ปกติจะอยู่ในไดเรกทอรี. คาสซานดรา

ในไฟล์นั้นต่อท้าย

[csv]
field_size_limit = 1000000000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.