_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 विकल्प का उपयोग करना था।
डस्टमैचिन

1
मैंने अपने प्रश्न को यह इंगित करने के लिए अद्यतन किया कि मेरे मामले में विशाल क्षेत्र हो सकते हैं। सीएसवी फ़ाइल में कोई बुरा डेटा नहीं है।
user1251007

1
@dustmachine ऐसी चीजें इसलिए होती हैं क्योंकि कभी-कभी आपको डेटाबेस टेबल में बेस 64 फॉर्मेट में इमेज (या अन्य बाइनरी फाइल) स्टोर करने वाले लोग मिल जाते हैं।
विंटरम्यूट

जवाबों:


315

Csv फ़ाइल में बहुत विशाल फ़ील्ड हो सकती हैं, इसलिए field_size_limit:

import sys
import csv

csv.field_size_limit(sys.maxsize)

sys.maxsizeअजगर 2.x और 3.x के लिए काम करता है। sys.maxintकेवल पायथन 2.x ( SO: what-is-sys-maxint-in-python-3 ) के साथ काम करेगा

अपडेट करें

जैसा कि ज्योफ ने बताया, उपरोक्त कोड के परिणामस्वरूप निम्न त्रुटि हो सकती है OverflowError: Python int too large to convert to C long:। इसे दरकिनार करने के लिए, आप निम्न त्वरित और गंदे कोड का उपयोग कर सकते हैं (जिसे पायथन 2 और पायथन 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
अजगर 2.6, के साथ विंडोज 7 64 बिट पर maxInt = sys.maxsizeरिटर्न 9223372036854775807Lजिसके फलस्वरूप एक में परिणाम है TypeError: limit must be an integerजब बुला csv.field_size_limit(maxInt)। दिलचस्प maxInt = int(sys.maxsize)बात यह है कि इसका उपयोग करने से इसमें बदलाव नहीं होता है। क्रूड वर्कअराउंड सिम्पी का उपयोग करना है csv.field_size_limit(2147483647)जो निश्चित रूप से अन्य प्लेटफार्मों पर मुद्दों का कारण बनता है। मेरे मामले में यह CSV में टूटे हुए मूल्य की पहचान करने, दूसरे आवेदन में निर्यात विकल्पों को ठीक करने और इसकी आवश्यकता को दूर करने के लिए किया गया था csv.field_size_limit()
रोजकॉरी

इसके लिए बहुत बहुत धन्यवाद, ive उम्र के लिए इस बग का पता लगाने की कोशिश कर रहा है!
केविन हर्नांडेज़

152

ऐसा इसलिए हो सकता है क्योंकि आपकी CSV फाइल में सिंगल या डबल कोट्स हैं। यदि आपकी CSV फ़ाइल टैब-सीमांकित है, तो इसे खोलने का प्रयास करें:

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

1
धन्यवाद!! यदि आप csvkit (एक उत्कृष्ट पायथन लाइब्रेरी और कमांड-लाइन csv टूलकिट) का उपयोग कर रहे हैं और मूल त्रुटि प्राप्त करते हैं क्योंकि आपकी फ़ाइल असंतुलित एकल या दोहरे उद्धरण चिह्नों का उपयोग करती है, तो आप -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

सीएसवी क्षेत्र के आकार को [अजगर 3. डॉक्स] के माध्यम से नियंत्रित किया जाता है : सीएसवी। field_size_limit ( [new_limit] ) :

पार्सर द्वारा अनुमत वर्तमान अधिकतम फ़ील्ड आकार देता है। यदि new_limit दिया जाता है, तो यह नई सीमा बन जाती है।

यह डिफ़ॉल्ट रूप से करने के लिए सेट कर दिया जाता 128k या 0x20000 ( 131,072 ), किसी भी सभ्य के लिए पर्याप्त होना चाहिए जो .csv :

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

हालाँकि, .csv फ़ाइल ( सही उद्धरण और सीमांकक के साथ ) के साथ काम करते समय, इस आकार की तुलना में कम से कम एक फ़ील्ड होने पर, त्रुटि पॉप अप हो जाती है।
त्रुटि से छुटकारा पाने के लिए, आकार सीमा को बढ़ाया जाना चाहिए (किसी भी चिंता से बचने के लिए, अधिकतम संभव मूल्य का प्रयास किया जाता है)।

दृश्यों के पीछे (जांच [गीथहब]: अजगर / cpython - (मास्टर) cpython / मॉड्यूल / _csv.c कार्यान्वयन विवरण के लिए), यह मान रखने वाला चर एक C लंबा ( [विकिपीडिया: C डेटा प्रकार ) है, जिसका आकार CPU आर्किटेक्चर और OS ( I L P ) पर निर्भर करता है । शास्त्रीय अंतर: 64 बिट ओएस ( पायथन बिल्ड) के लिए, लंबे प्रकार का आकार ( बिट्स में ) है:

  • निक्स : 64
  • जीत : 32

इसे सेट करने का प्रयास करते समय, नए मान को लंबी सीमाओं में जांचा जाता है , इसीलिए कुछ मामलों में एक और अपवाद पॉप अप होता है (यह मामला विन पर आम है ):

>>> 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 ) सेट करें ( धन्यवाद [पायथन 3. डॉक्स]: ctypes - पायथन के लिए एक विदेशी फ़ंक्शन लाइब्रेरी )। यह किसी भी CPU / OS पर Python 3 और Python 2 पर काम करना चाहिए ।

>>> 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 बिट पायथन :

>>> 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'

के लिए 32 बिट अजगर , चीजों को वर्दी हैं: यह व्यवहार पर का सामना करना पड़ा है जीत

अधिक जानकारी के लिए निम्नलिखित संसाधनों की जाँच करें:


2

मैं सिर्फ एक 'सादे' CSV फ़ाइल पर मेरे साथ ऐसा हुआ था। कुछ लोग इसे अमान्य स्वरूपित फ़ाइल कह सकते हैं। कोई भागने के पात्र नहीं, कोई दोहरे उद्धरण नहीं और परिसीमन एक अर्धविराम था।

इस फ़ाइल की एक नमूना रेखा इस तरह दिखाई देगी:

पहला सेल; दूसरा "एक डबल उद्धरण और अग्रणी स्थान के साथ सेल; 'आंशिक रूप से उद्धृत' सेल; अंतिम सेल

दूसरी सेल में सिंगल कोटर अपनी रेल को पार कर जाएगा। क्या काम किया गया था:

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

1

कभी-कभी, एक पंक्ति में डबल उद्धरण कॉलम होता है। जब सीएसवी रीडर इस पंक्ति को पढ़ने की कोशिश करता है, तो कॉलम के अंत को नहीं समझा जाता है और इस आग को बढ़ाता है। समाधान नीचे है:

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)

कोई बुरी रेखा नहीं है ... जैसा कि प्रश्न में लिखा गया है: सीएसवी फ़ाइलों में विशाल फ़ील्ड होते हैं और इस डेटा का विश्लेषण करने की आवश्यकता होती है।
user1251007

1
खराब पंक्तियों की अवधारणा में pandasउन पंक्तियों को शामिल किया जाता है जो क्षेत्र की सीमा से अधिक होती हैं csv। इसलिए, यदि आप इन लाइनों को छोड़ना चाहते हैं और अन्य लाइनों को सफलतापूर्वक पढ़ना चाहते हैं, तो आप इस समाधान का उपयोग कर सकते हैं। अन्यथा, जब आपके लिए विशाल फ़ील्ड की आवश्यकता होती है, तो फ़ील्ड की सीमा बढ़ाना csv.field_size_limit(100000000)उचित होता है।
0x01h

-1

सामान्यतया cclshrc फ़ाइल खोजें। कैसंड्रा निर्देशिका में।

उस फ़ाइल में,

[csv]
field_size_limit = 1000000000
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.