2013-08-02 6 views
13

python3 का उपयोग करने के लिए कई csv फ़ाइलें पढ़ने, पांडा 0.12पांडा ParserError EOF चरित्र जब HDF5

मैं (कुल आकार 7.9 है जीबी) एक HDF5 दुकान में बाद में बाद कार्रवाई करने के लिए कई csv फ़ाइलें लिखने की कोशिश कर रहा हूँ। सीएसवी फाइलों में लगभग दस लाख पंक्तियां होती हैं, 15 कॉलम और डेटा प्रकार ज्यादातर स्ट्रिंग होते हैं, लेकिन कुछ फ्लोट होते हैं। लेकिन जब मैं csv फ़ाइलें मैं निम्नलिखित त्रुटि मिलती है पढ़ने के लिए कोशिश कर रहा हूँ:

Traceback (most recent call last): 
    File "filter-1.py", line 38, in <module> 
    to_hdf() 
    File "filter-1.py", line 31, in to_hdf 
    for chunk in reader: 
    File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 578, in __iter__ 
    yield self.read(self.chunksize) 
    File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 608, in read 
    ret = self._engine.read(nrows) 
    File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 1028, in read 
    data = self._reader.read(nrows) 
    File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandas\parser.c:6745) 
    File "parser.pyx", line 740, in pandas.parser.TextReader._read_low_memory (pandas\parser.c:7146) 
    File "parser.pyx", line 781, in pandas.parser.TextReader._read_rows (pandas\parser.c:7568) 
    File "parser.pyx", line 768, in pandas.parser.TextReader._tokenize_rows (pandas\parser.c:7451) 
    File "parser.pyx", line 1661, in pandas.parser.raise_parser_error (pandas\parser.c:18744) 
pandas.parser.CParserError: Error tokenizing data. C error: EOF inside string starting at line 754991 
Closing remaining open files: ta_store.h5... done 

संपादित:

मैं एक फ़ाइल है कि इस समस्या का उत्पादन किया खोज करने में कामयाब। मुझे लगता है कि यह एक ईओएफ चरित्र पढ़ रहा है। हालांकि मुझे इस समस्या से निपटने के लिए कोई सुराग नहीं है। संयुक्त फाइलों के बड़े आकार को देखते हुए मुझे लगता है कि प्रत्येक स्ट्रिंग में प्रत्येक वर्ण को जांचना बहुत बोझिल है। (तब भी मुझे यकीन नहीं होगा कि क्या करना है।) जहां तक ​​मैंने जांच की है, सीएसवी फाइलों में कोई अजीब पात्र नहीं हैं जो त्रुटि को बढ़ा सकता है। मैंने error_bad_lines=False को pd.read_csv() पर जाने का भी प्रयास किया, लेकिन त्रुटि बनी हुई है।

# -*- coding: utf-8 -*- 

import pandas as pd 
import os 
from glob import glob 


def list_files(path=os.getcwd()): 
    ''' List all files in specified path ''' 
    list_of_files = [f for f in glob('2013-06*.csv')] 
    return list_of_files 


def to_hdf(): 
    """ Function that reads multiple csv files to HDF5 Store """ 
    # Defining path name 
    path = 'ta_store.h5' 
    # If path exists delete it such that a new instance can be created 
    if os.path.exists(path): 
     os.remove(path) 
    # Creating HDF5 Store 
    store = pd.HDFStore(path) 

    # Reading csv files from list_files function 
    for f in list_files(): 
     # Creating reader in chunks -- reduces memory load 
     reader = pd.read_csv(f, chunksize=50000) 
     # Looping over chunks and storing them in store file, node name 'ta_data' 
     for chunk in reader: 
      chunk.to_hdf(store, 'ta_data', mode='w', table=True) 

    # Return store 
    return store.select('ta_data') 
    return 'Finished reading to HDF5 Store, continuing processing data.' 

to_hdf() 

संपादित

अगर मैं CSV फ़ाइल CParserError EOF उठाती में जाने ... और मैन्युअल कि खड़ी कर रहा है पंक्ति के बाद सभी पंक्तियों को हटा दें:

मेरे कोड पीछा कर रहा है समस्या, सीएसवी फ़ाइल ठीक से पढ़ा जाता है। हालांकि, मैं जो भी हटा रहा हूं वह रिक्त पंक्तियां वैसे भी हैं। अजीब बात यह है कि जब मैं गलत सीएसवी फाइलों को मैन्युअल रूप से सही करता हूं, तो वे अलग-अलग स्टोर में ठीक से लोड होते हैं। लेकिन जब मैं फिर से कई फाइलों की एक सूची का उपयोग करता हूं तो 'झूठी' फाइलें अभी भी मुझे त्रुटियां लौटाती हैं।

+0

'' mode = 'w''' पास न करें; आप प्रत्येक पुनरावृत्ति – Jeff

+0

पर एचडीएफ फ़ाइल को छीन रहे हैं, आप CParserError को पकड़ने का प्रयास कर सकते हैं और बस उस फ़ाइल को छोड़ सकते हैं (जब तक आप इसे ठीक नहीं करते) – Jeff

+0

हाय जेफ, आप कैसे सुझाव देते हैं कि मैं CParserError को पकड़ता हूं। प्रत्येक व्यक्तिगत फाइलों की जांच करने के लिए यह बहुत बोझिल है। – Matthijs

उत्तर

5

की तरह इस आप 'बुरे' फ़ाइल का पता लगाने (और आगे की जांच) के लिए अनुमति देगा अपने भीतर के पाश बनाने

from pandas.io import parser 

def to_hdf(): 

    ..... 

    # Reading csv files from list_files function 
    for f in list_files(): 
     # Creating reader in chunks -- reduces memory load 

     try: 

      reader = pd.read_csv(f, chunksize=50000) 

      # Looping over chunks and storing them in store file, node name 'ta_data' 
      for chunk in reader: 
       chunk.to_hdf(store, 'ta_data', table=True) 

     except (parser.CParserError) as detail: 
      print f, detail 
+0

हाय जेफ, धन्यवाद! यह काम करता है और मुझे पता चला कि फाइलें/रेखाएं समस्या का कारण बन रही हैं। अब मैं मैन्युअल रूप से उन फ़ाइलों को 'सही' करने का प्रयास कर सकता हूं, लेकिन मेरे पास एक और प्रोग्रामेटिक समाधान होगा। इस प्रकार मुझे यह समझने की जरूरत है कि वास्तव में मुझे क्या त्रुटि आ रही है और मैं किस प्रकार का कोड लिखता हूं जो स्वचालित रूप से उस समस्या का ख्याल रखता है। – Matthijs

+0

आप लिनक्स पर अनिवार्य रूप से ''\ n''' (या '\ n \ r''' विंडोज़ पर सोचने पर '' \ n''' निर्दिष्ट करने का प्रयास कर सकते हैं। और बदतर में आपको एक खराब रेखा मिलती है (जैसा कि अमान्य टर्मिनेटर अगली पंक्ति में रखा जाता है) ..... लेकिन यह देखने की आवश्यकता है कि पहले स्थान में क्या गलत है: http://pandas.pydata.org/pandas-docs/dev/io.html#csv-text-files – Jeff

+0

अजीब चीज यह है कि जब मैं गलत सीएसवी फाइलों को मैन्युअल रूप से सही करता हूं, तो उन्हें अलग-अलग स्टोर में ठीक से लोड किया जाता है। लेकिन जब मैं फ़ाइलों के समूह को पढ़ने के लिए फिर से 'ग्लोब' का उपयोग करता हूं तो ये फ़ाइलें अभी भी मुझे त्रुटियां लौटाती हैं। – Matthijs

38

मैं एक ऐसी ही समस्या थी। 'ईओएफ अंदर स्ट्रिंग' के साथ सूचीबद्ध रेखा में एक स्ट्रिंग थी जिसमें इसके भीतर एक सिंगल कोट चिह्न था। जब मैंने उद्धरण = csv.QUOTE_NONE विकल्प जोड़ा, तो यह मेरी समस्या को ठीक करता है।

उदाहरण के लिए:

df = pd.read_csv(csvfile, header = None, delimiter="\t", quoting=csv.QUOTE_NONE, encoding='utf-8') 
+0

के साथ काम नहीं कर सकता है यह एक इष्टतम समाधान है – DACW

+2

मैंने 'आयात csv' – user1700890

4

मैं एक ही समस्या है, और मेरे कोड में ये दो पैरामीटर जोड़ने के बाद, समस्या चला गया है।

read_csv (... quoting=3 , error_bad_lines=False)

+0

भी जोड़ा है यह आकर्षण की तरह काम करता है। एक पंक्ति में एक त्रुटि हुई थी। उपर्युक्त विकल्प के साथ निष्पादन के बाद मुझे निम्नलिखित संदेश मिला 'छोड़ने वाली लाइन 1 9 2: अपेक्षित 5 फ़ील्ड, 74' –

0

मेरे लिए, अन्य समाधान काम नहीं करते और मुझे काफी सिरदर्द का कारण बन गया। error_bad_lines = झूठी अभी भी त्रुटि C error: EOF inside string starting at line देता है। एक अलग उद्धरण का उपयोग करके वांछित परिणाम नहीं दिए गए, क्योंकि मैं अपने पाठ में उद्धरण नहीं चाहता था।

मुझे एहसास हुआ कि पांडस 0.20 में एक बग था। संस्करण 0.21 में अपग्रेड करने से पूरी तरह से मेरी समस्या हल हो गई। इस बग के बारे में अधिक जानकारी, देखें: https://github.com/pandas-dev/pandas/issues/16559

नोट: यह यूआरएल में उल्लिखित विंडोज से संबंधित हो सकता है।

+0

देखा यह काम नहीं करता है - पांडा-0.22.0 में अपग्रेड करने के बाद भी मुझे एक ही त्रुटि मिल रही है –

1

समाधान read_csv फ़ंक्शन में पैरामीटर इंजन = 'पायथन' का उपयोग करना है। पांडस सीएसवी पार्सर एक सीएसवी फ़ाइल पार्स करने के लिए दो अलग-अलग "इंजन" का उपयोग कर सकते हैं - पायथन या सी (जो भी डिफ़ॉल्ट है)।

pandas.read_csv(filepath, sep=',', delimiter=None, 
      header='infer', names=None, 
      index_col=None, usecols=None, squeeze=False, 
      ..., engine=None, ...) 

अजगर इंजन होने के लिए वर्णित है "धीमी है, लेकिन अधिक पूरा सुविधा है" Pandas documentation में।

engine : {‘c’, ‘python’} 
संबंधित मुद्दे