पायथन पंडों डेटा टोकन में त्रुटि


343

मैं एक .csv फ़ाइल में हेरफेर करने के लिए पांडा का उपयोग करने की कोशिश कर रहा हूं, लेकिन मुझे यह त्रुटि मिली:

pandas.parser.CParserError: डेटा को टोकन करने में त्रुटि। सी त्रुटि: पंक्ति 3 में 2 क्षेत्रों की उम्मीद, 12 देखा

मैंने पंडों के डॉक्स पढ़ने की कोशिश की है, लेकिन कुछ नहीं मिला।

मेरा कोड सरल है:

path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)

मैं इसे कैसे हल करूं? क्या मुझे csvमॉड्यूल या किसी अन्य भाषा का उपयोग करना चाहिए ?

फाइल मॉर्निंगस्टार की है


10
यदि यह त्रुटि किसी लिखित फ़ाइल को पढ़ते समय उत्पन्न होती है pandas.to_csv(), तो यह हो सकता है क्योंकि स्तंभ नामों में एक '\ r' होता है, जिस स्थिति में to_csv () वास्तव में डेटा स्तंभ के पहले कॉलम में बाद के कॉलम के नाम लिखेगा, जिससे पहली X पंक्तियों में स्तंभों की संख्या के बीच का अंतर। यह अंतर C त्रुटि का एक कारण है।
उपयोगकर्ता 0

9
शायद ही कभी "सेप" पैरामीटर को स्पष्ट रूप से देने में मदद मिलती है। एक पार्सर मुद्दा लगता है।
गिलागमश

2
यह त्रुटि तब भी उत्पन्न हो सकती है जब आप अल्पविराम को एक सीमांकक के रूप में उपयोग कर रहे हैं और आपके पास तब अधिक अल्पविराम हैं, जो अपेक्षित है (त्रुटि पंक्ति में अधिक फ़ील्ड तब शीर्ष लेख में परिभाषित किया गया है)। तो आपको अतिरिक्त फ़ील्ड हटाने या अतिरिक्त कॉमा को हटाने की आवश्यकता है यदि यह गलती से है। आप इसे मैन्युअल रूप से ठीक कर सकते हैं और फिर आपको त्रुटि लाइनों को छोड़ने की आवश्यकता नहीं है।
tsveti_iko

2
गिलगामश की टिप्पणी से मुझे मदद मिली। पाठ संपादक (जैसे कि विंडोज़ संपादक या नोटपैड ++) में सीएसवी फ़ाइल खोलें ताकि देखें कि किस चरित्र का उपयोग अलगाव के लिए किया जाता है। यदि यह एक अर्धविराम उदाहरण है pd.read_csv("<path>", sep=";")। चेकिंग के लिए एक्सेल का उपयोग न करें क्योंकि यह कभी-कभी डेटा को डिफ़ॉल्ट रूप से कॉलम में रखता है और इसलिए विभाजक को हटा देता है।
जुलियन

@Gilgamash द्वारा टिप्पणी के बारे में - इसने मुझे सही दिशा में भेजा, हालाँकि मेरे मामले में यह स्पष्ट रूप से "एसईपी" पैरामीटर नहीं देकर हल किया गया था ।
TheLoneDeranger

जवाबों:


515

आप भी कोशिश कर सकते हैं;

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

ध्यान दें कि यह आपत्तिजनक रेखाओं को छोड़ देगा।


152
कृपया ध्यान दें कि error_bad_lines = गलत का उपयोग करने से अपमानजनक रेखाएं बंद हो जाएंगी।
बायोबर्डमैन

10
इस उत्तर पर ठोकर खाई, क्या लाइनों पर लापता कॉलम को भरने का एक तरीका है जो कुछ इस तरह से आउटपुट करता है expected 8 fields, saw 9?
पेट्रा बारूस

26
बेहतर उपाय यह है कि आपत्तिजनक फ़ाइल की जांच करें और खराब लाइनों को ठीक करें ताकि उन्हें पढ़ा जा सके read_csv। @PetraBarus, क्यों न केवल उन CSV फ़ाइलों में कॉलम जोड़े जाएं जो उन्हें याद कर रही हैं (आवश्यकतानुसार आवश्यकतानुसार शून्य मान)?
22

4
हां, मैंने बस यही किया। कॉलम जोड़ना बहुत आसान है। एक स्प्रेडशीट में CSV खोलना ऐसा करता है।
पेट्रा बारूस

5
names=["col1", "col2", ...]अपेक्षित कॉलम की अधिकतम संख्या के लिए पासिंग भी काम करता है, और यह है कि जब मैंने इसे पार किया तो मैंने इस मुद्दे को हल किया। देखें: stackoverflow.com/questions/18039057/…
स्टीवन रूक

100

यह एक मुद्दा हो सकता है

  • आपके डेटा में सीमांकक
  • पहली पंक्ति, जैसा कि @TomAugspurger ने उल्लेख किया है

इसे हल करने के लिए, कॉल करते समय sepऔर / या headerतर्कों को निर्दिष्ट करने का प्रयास करें read_csv। उदाहरण के लिए,

df = pandas.read_csv(fileName, sep='delimiter', header=None)

उपरोक्त कोड में, sepआपके सीमांकक को परिभाषित करता है और header=Noneपांडा को बताता है कि आपके स्रोत डेटा में हेडर / कॉलम शीर्षक के लिए कोई पंक्ति नहीं है। इस प्रकार डॉक्स को साफ करें : "यदि फ़ाइल में कोई हेडर पंक्ति नहीं है, तो आपको हेडर = कोई नहीं" स्पष्ट रूप से पास करना चाहिए। इस उदाहरण में, पांडा स्वचालित रूप से प्रत्येक क्षेत्र {0,1,2, ...} के लिए पूरे-पूरे सूचकांक बनाता है।

डॉक्स के अनुसार, सीमांकक बात एक मुद्दा नहीं होनी चाहिए । डॉक्स कहते हैं कि "अगर सेप कोई नहीं [निर्दिष्ट नहीं] है, तो स्वचालित रूप से यह निर्धारित करने का प्रयास करेगा।" हालांकि, मुझे इस बात का सौभाग्य नहीं मिला है, जिसमें स्पष्ट परिसीमन वाले उदाहरण भी शामिल हैं।


हां, कभी-कभी परिसीमन इस मुद्दे का कारण हो सकता है। मुझे उसी मुद्दे का सामना करना पड़ा जहां सीमांक एक अर्धविराम (;) था
अनुराग शर्मा

43

फ़ाइल के हेडर से पार्सर भ्रमित हो रहा है। यह पहली पंक्ति को पढ़ता है और उस पंक्ति से स्तंभों की संख्या को बढ़ाता है। लेकिन पहली दो पंक्तियाँ फ़ाइल में वास्तविक डेटा की प्रतिनिधि नहीं हैं।

इसके साथ प्रयास करें data = pd.read_csv(path, skiprows=2)


30

आपकी CSV फ़ाइल में स्तंभों की चर संख्या हो सकती है और read_csvपहले कुछ पंक्तियों से स्तंभों की संख्या का अनुमान लगाया जा सकता है । इस मामले में इसे हल करने के दो तरीके:

1) अधिकतम कॉलम (और निर्दिष्ट करें) के साथ डमी पहली पंक्ति के लिए CSV फ़ाइल बदलें header=[0] ) के

2) या names = list(range(0,N))एन जहां कॉलम की अधिकतम संख्या है उसका उपयोग करें ।


25

यह निश्चित रूप से सीमांकक का एक मुद्दा है, क्योंकि अधिकांश CSV CSV को विभाजक का उपयोग करके टैब वर्ण का उपयोग sep='/t'करने read_csvका प्रयास करते हुए बनाया गया है । इसलिए, निम्न कोड लाइन का उपयोग करके खोलने का प्रयास करें।(\t)/t

data=pd.read_csv("File_path", sep='\t')

5
@MichaelQueue: यह गलत है। एक CSV, हालांकि आमतौर पर अल्पविराम द्वारा सीमांकित किया जाता है, अन्य पात्रों द्वारा भी सीमांकित किया जा सकता है। CSV विनिर्देशों को देखें । यह एक अल्पविराम, एक टैब ('\ t'), अर्धविराम और संभवतः अतिरिक्त स्थान हो सकता है। :)
डीजेग्रांडपाज

मेरे मामले में यह एक विभाजक मुद्दा था। read_csv जाहिरा तौर पर अल्पविराम के लिए चूक करता है, और मेरे पास पाठ फ़ील्ड हैं जिसमें अल्पविराम शामिल हैं (और डेटा वैसे भी एक अलग विभाजक के साथ संग्रहीत किया गया था)
user108569

यदि मानों में अल्पविराम का उपयोग किया जाता है, लेकिन टैब परिसीमनकर्ता है और सीप का उपयोग नहीं किया जाता है (या जैसा कि यह मान लिया जाए कि परिसीमन के ऊपर सुझाव दिया गया है) तो यह त्रुटि उत्पन्न होगी। सुनिश्चित करें कि सीमांकक किसी भी मान में नहीं होता है और कुछ पंक्तियों में कॉलम की गलत संख्या दिखाई देगी
demongolem

मैं CSV बनाते समय एक्सेल 2016 का उपयोग कर रहा हूँ, और sep = 'का उपयोग कर रहा हूँ;' मेरे लिए काम
अब्दुल्ला ने

18

मुझे भी यह समस्या थी लेकिन शायद एक अलग कारण से। मेरे सीएसवी में कुछ अनुगामी अल्पविराम थे जो एक अतिरिक्त स्तंभ जोड़ रहे थे जो पंडों को पढ़ने का प्रयास कर रहा था। निम्नलिखित कार्यों का उपयोग करना, लेकिन यह खराब रेखाओं की उपेक्षा करता है:

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

यदि आप त्रुटियों को संभालने के लिए लाइनों को एक बदसूरत प्रकार की हैक रखना चाहते हैं, तो निम्न जैसा कुछ करना है:

line     = []
expected = []
saw      = []     
cont     = True 

while cont == True:     
    try:
        data = pd.read_csv('file1.csv',skiprows=line)
        cont = False
    except Exception as e:    
        errortype = e.message.split('.')[0].strip()                                
        if errortype == 'Error tokenizing data':                        
           cerror      = e.message.split(':')[1].strip().replace(',','')
           nums        = [n for n in cerror.split(' ') if str.isdigit(n)]
           expected.append(int(nums[0]))
           saw.append(int(nums[2]))
           line.append(int(nums[1])-1)
         else:
           cerror      = 'Unknown'
           print 'Unknown Error - 222'

if line != []:
    # Handle the errors however you want

मैंने DataFrame में लाइनों को पुन: स्थापित करने के लिए एक स्क्रिप्ट लिखने के लिए आगे बढ़ा, क्योंकि उपरोक्त कोड में चर 'लाइन' द्वारा खराब लाइनें दी जाएंगी। यह केवल सीएसवी रीडर का उपयोग करके सभी से बचा जा सकता है। उम्मीद है कि पांडा डेवलपर्स भविष्य में इस स्थिति से निपटने के लिए आसान बना सकते हैं।


14

मुझे यह समस्या थी, जहां मैं कॉलम नामों में पारित किए बिना एक सीएसवी में पढ़ने की कोशिश कर रहा था।

df = pd.read_csv(filename, header=None)

मैंने पहले से एक सूची में कॉलम के नाम निर्दिष्ट किए और फिर उन्हें पास किया namesऔर इसे तुरंत हल कर दिया। यदि आपके पास कॉलम नाम सेट नहीं हैं, तो आप अपने डेटा में अधिकतम स्तंभ संख्या के रूप में कई प्लेसहोल्डर नाम बना सकते हैं।

col_names = ["col1", "col2", "col3", ...]
df = pd.read_csv(filename, names=col_names)

1
यह उत्तर बेहतर है क्योंकि अगर पंक्ति error_bad_line = गलत का उपयोग करने की तुलना में डिलीट नहीं होती है। इसके अतिरिक्त, आप आसानी से यह पता लगा सकते हैं कि इस समाधान से डेटाफ़्रेम बनाते समय कौन सी रेखाएँ समस्याएँ थीं।
zipline86

मैं @ zipline86 से सहमत हूं। यह उत्तर सुरक्षित और बुद्धिमान है।
मोनिका हेडडेक

11

मैंने खुद कुछ बार यह समस्या की है। लगभग हर बार, इसका कारण यह है कि जिस फ़ाइल को मैं खोलने की कोशिश कर रहा था, वह शुरू करने के लिए एक अच्छी तरह से सहेजी गई सीएसवी नहीं थी। और "ठीक से" से, मेरा मतलब है कि प्रत्येक पंक्ति में समान विभाजक या कॉलम थे।

आमतौर पर ऐसा हुआ क्योंकि मैंने एक्सेल में सीएसवी खोला था फिर अनुचित तरीके से इसे बचाया। हालांकि फ़ाइल एक्सटेंशन अभी भी .csv में था, लेकिन शुद्ध CSV प्रारूप को बदल दिया गया था।

पांडा_ tovv के साथ सहेजी गई कोई भी फ़ाइल ठीक से स्वरूपित होगी और उस समस्या को नहीं होना चाहिए। लेकिन अगर आप इसे किसी अन्य प्रोग्राम से खोलते हैं, तो यह संरचना को बदल सकता है।

उम्मीद है की वो मदद करदे।


8

मैं उसी मुद्दे पर आया था। का उपयोग करते हुएpd.read_table()उसी स्रोत फ़ाइल काम करने लगा। मैं इसके कारण का पता नहीं लगा सका लेकिन यह मेरे मामले के लिए एक उपयोगी समाधान था। शायद कोई और जानकार इस बात पर ज्यादा प्रकाश डाल सकता है कि इसने काम क्यों किया।

संपादित करें: मैंने पाया कि यह त्रुटि तब होती है जब आपकी फ़ाइल में कुछ पाठ होता है जिसमें वास्तविक डेटा के समान प्रारूप नहीं होता है। यह आमतौर पर शीर्ष लेख या पाद लेख की जानकारी (एक से अधिक पंक्ति होती है, इसलिए स्किप_हेडर काम नहीं करता है) जिसे आपके वास्तविक डेटा (जब read_csv का उपयोग करते हुए) के रूप में एक ही संख्या में अल्पविराम से अलग नहीं किया जाएगा। Read_table का उपयोग करके सीमांकक के रूप में एक टैब का उपयोग किया जाता है जो उपयोगकर्ताओं को वर्तमान त्रुटि को दरकिनार कर सकता है लेकिन दूसरों को पेश कर सकता है।

मैं आमतौर पर एक फ़ाइल में अतिरिक्त डेटा को पढ़कर इसके चारों ओर मिलता हूं फिर read_csv () विधि का उपयोग करता हूं।

आपकी वास्तविक फ़ाइल के आधार पर सटीक समाधान भिन्न हो सकता है, लेकिन इस दृष्टिकोण ने मेरे लिए कई मामलों में काम किया है


6

निम्नलिखित ने मेरे लिए काम किया (मैंने इस उत्तर को पोस्ट किया, क्योंकि मुझे विशेष रूप से एक Google सहयोगी नोटबुक में यह समस्या थी):

df = pd.read_csv("/path/foo.csv", delimiter=';', skiprows=0, low_memory=False)

1
मैंने |अपने .csv के लिए सीमांकक के रूप में स्थापित नहीं करने पर समस्याओं का प्रयोग किया । मैं लंघन लाइनों, या खराब लाइनों के बजाय पहले इस दृष्टिकोण की कोशिश करता हूं।
ivanleoncz

मुझे भी यही समस्या थी, मैंने मान लिया कि "\ t" को डिफ़ॉल्ट रूप से सीमांकक के रूप में पाया जाएगा। यह तब हुआ जब मैंने स्पष्ट रूप से सीमांकक को "\ t" पर सेट किया।
राहुल झा

5

रिक्त स्थान, अल्पविराम और उद्धरण के साथ टैब-सीमांकित तालिका को पढ़ने का प्रयास करते समय मुझे इसी तरह की समस्या हुई है:

1115794 4218    "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", ""
1144102 3180    "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "g__Bacillus", ""
368444  2328    "k__Bacteria", "p__Bacteroidetes", "c__Bacteroidia", "o__Bacteroidales", "f__Bacteroidaceae", "g__Bacteroides", ""



import pandas as pd
# Same error for read_table
counts = pd.read_csv(path_counts, sep='\t', index_col=2, header=None, engine = 'c')

pandas.io.common.CParserError: Error tokenizing data. C error: out of memory

यह कहता है कि इसमें सी पार्सिंग इंजन (जो डिफ़ॉल्ट एक है) के साथ कुछ करना है। शायद एक अजगर को बदलने से कुछ भी बदल जाएगा

counts = pd.read_table(path_counts, sep='\t', index_col=2, header=None, engine='python')

Segmentation fault (core dumped)

अब वह एक अलग त्रुटि है।
यदि हम आगे बढ़ते हैं और तालिका से रिक्त स्थान को हटाने की कोशिश करते हैं, तो अजगर-इंजन से त्रुटि एक बार फिर से बदल जाती है:

1115794 4218    "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae",""
1144102 3180    "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","g__Bacillus",""
368444  2328    "k__Bacteria","p__Bacteroidetes","c__Bacteroidia","o__Bacteroidales","f__Bacteroidaceae","g__Bacteroides",""


_csv.Error: '   ' expected after '"'

और यह स्पष्ट हो जाता है कि पांडा को हमारी पंक्तियों को समझने में समस्या हो रही थी। अजगर इंजन के साथ एक मेज को पार्स करने के लिए मुझे पहले से टेबल से सभी रिक्त स्थान और उद्धरण निकालने की आवश्यकता थी। इस बीच सी-इंजन पंक्तियों में कॉमा के साथ भी दुर्घटनाग्रस्त होता रहा।

प्रतिस्थापन के साथ एक नई फ़ाइल बनाने से बचने के लिए मैंने ऐसा किया, क्योंकि मेरी तालिकाएँ छोटी हैं:

from io import StringIO
with open(path_counts) as f:
    input = StringIO(f.read().replace('", ""', '').replace('"', '').replace(', ', ',').replace('\0',''))
    counts = pd.read_table(input, sep='\t', index_col=2, header=None, engine='python')

tl; डॉ।
पार्सिंग इंजन बदलें, अपने डेटा में किसी भी गैर-परिसीमन उद्धरण / अल्पविराम / रिक्त स्थान से बचने का प्रयास करें।


5

मेरे द्वारा उपयोग किए जाने वाले डेटासेट में बहुत अधिक उद्धरण चिह्न (") स्वरूपण का उपयोग किया गया था। मैं इसके लिए इस पैरामीटर को शामिल करके त्रुटि को ठीक करने में सक्षम था read_csv():

quoting=3 # 3 correlates to csv.QUOTE_NONE for pandas

2
एक ही बात भर में ठोकर खाई। जहां तक ​​मेरा सवाल है, यह सही जवाब है। स्वीकृत एक त्रुटि को छिपाता है।
lhk

मेरे लिए भी सही उत्तर। +1
ताहा जिरजीस


3

यद्यपि इस प्रश्न के लिए मामला नहीं है, यह त्रुटि संकुचित डेटा के साथ भी दिखाई दे सकती है। स्पष्ट रूप से kwarg compressionमेरी समस्या को हल करने के लिए मूल्य निर्धारित करना ।

result = pandas.read_csv(data_source, compression='gzip')

3

एक वैकल्पिक विकल्प जिसे मैंने समान पार्सिंग त्रुटियों से निपटने के लिए उपयोगी पाया है, डेटा को फिर से पैंडस डीएफ में सीएसवी मॉड्यूल का उपयोग करता है। उदाहरण के लिए:

import csv
import pandas as pd
path = 'C:/FileLocation/'
file = 'filename.csv'
f = open(path+file,'rt')
reader = csv.reader(f)

#once contents are available, I then put them in a list
csv_list = []
for l in reader:
    csv_list.append(l)
f.close()
#now pandas has no problem getting into a df
df = pd.DataFrame(csv_list)

मुझे लगता है कि CSV मॉड्यूल खराब स्वरूपित अल्पविराम से अलग की गई फ़ाइलों के लिए थोड़ा अधिक मजबूत है और इसलिए इस तरह के मुद्दों के समाधान के लिए इस मार्ग से सफलता मिली है।


3

निम्नलिखित कार्य का क्रम काम करता है (मैं डेटा की पहली पंक्ति खो देता हूँ-हेडर = कोई भी मौजूद नहीं- लेकिन कम से कम यह लोड होता है):

df = pd.read_csv(filename, usecols=range(0, 42)) df.columns = ['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14']

निम्नलिखित काम नहीं करता है:

df = pd.read_csv(filename, names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'], usecols=range(0, 42))

CParserError: डेटा को टोकन करने में त्रुटि। सी त्रुटि: 1605634 में 53 क्षेत्रों की उम्मीद, 54 ने देखा काम नहीं कर रहा है:

df = pd.read_csv(filename, header=None)

CParserError: डेटा को टोकन करने में त्रुटि। सी त्रुटि: 1605634 में 53 क्षेत्रों की उम्मीद, 54 को देखा

इसलिए, आपकी समस्या में आपको पास होना होगा usecols=range(0, 2)


3

उन लोगों के लिए जो लिनक्स ओएस पर पायथन 3 के साथ समान समस्या रखते हैं।

pandas.errors.ParserError: Error tokenizing data. C error: Calling
read(nbytes) on source failed. Try engine='python'.

प्रयत्न:

df.read_csv('file.csv', encoding='utf8', engine='python')

2

कभी-कभी समस्या यह नहीं है कि अजगर का उपयोग कैसे किया जाए, बल्कि कच्चे डेटा के साथ।
मुझे यह त्रुटि संदेश मिला

Error tokenizing data. C error: Expected 18 fields in line 72, saw 19.

यह पता चला कि कॉलम विवरण में कभी-कभी कॉमा थे। इसका मतलब है कि CSV फ़ाइल को साफ करने या उपयोग किए जाने वाले किसी अन्य विभाजक को साफ करने की आवश्यकता है।


2

उपयोग pandas.read_csv('CSVFILENAME',header=None,sep=', ')

जब लिंक से सीएसवी डेटा पढ़ने की कोशिश कर रहा हो

http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data

मैंने साइट से डेटा को अपने csvfile में कॉपी किया। इसमें अतिरिक्त स्थान थे इसलिए sep = ',' का उपयोग किया और यह काम किया :)


1

मेरे पास पहले से मौजूद पंक्ति संख्याओं वाला डेटासेट था, मैंने index_col का उपयोग किया:

pd.read_csv('train.csv', index_col=0)

1

यह जो मैंने किया है।

sep='::' मेरी समस्या हल की:

data=pd.read_csv('C:\\Users\\HP\\Downloads\\NPL ASSINGMENT 2 imdb_labelled\\imdb_labelled.txt',engine='python',header=None,sep='::')


1

मुझे एक ही समस्या है जब read_csv: ParserError: त्रुटि टोकन डेटा। मैंने अभी पुरानी सीएसवी फ़ाइल को एक नई सीएसवी फ़ाइल में सहेजा है। समस्या सुलझ गई है!


1

मेरे लिए मुद्दा यह था कि मेरे सीएसवी इंट्राडे में एक नया कॉलम जोड़ा गया था । यदि मैं उपयोग करता हूं तो स्वीकृत उत्तर समाधान काम नहीं करेगा क्योंकि भविष्य की प्रत्येक पंक्ति को छोड़ दिया जाएगा error_bad_lines=False

इस मामले में समाधान में usecols पैरामीटर का उपयोग करना था pd.read_csv()। इस तरह मैं केवल उन कॉलमों को निर्दिष्ट कर सकता हूं, जिन्हें मुझे CSV में पढ़ने की आवश्यकता है और मेरा पायथन कोड भविष्य में CSV परिवर्तनों के लिए लचीला रहेगा, जब तक कि हेडर कॉलम मौजूद है (और कॉलम नाम नहीं बदलते)।

usecols : list-like or callable, optional 

Return a subset of the columns. If list-like, all elements must either
be positional (i.e. integer indices into the document columns) or
strings that correspond to column names provided either by the user in
names or inferred from the document header row(s). For example, a
valid list-like usecols parameter would be [0, 1, 2] or ['foo', 'bar',
'baz']. Element order is ignored, so usecols=[0, 1] is the same as [1,
0]. To instantiate a DataFrame from data with element order preserved
use pd.read_csv(data, usecols=['foo', 'bar'])[['foo', 'bar']] for
columns in ['foo', 'bar'] order or pd.read_csv(data, usecols=['foo',
'bar'])[['bar', 'foo']] for ['bar', 'foo'] order.

उदाहरण

my_columns = ['foo', 'bar', 'bob']
df = pd.read_csv(file_path, usecols=my_columns)

इसका एक और लाभ यह है कि मैं मेमोरी में कम डेटा लोड कर सकता हूं अगर मैं केवल एक सीएसवी के 3-4 कॉलम का उपयोग कर रहा हूं जिसमें 18-20 कॉलम हैं।


1

सरल संकल्प : एक्सेल में सीएसवी फ़ाइल खोलें और इसे सीएसवी प्रारूप के विभिन्न नाम फ़ाइल के साथ सहेजें। फिर से इसे स्पाइडर आयात करने की कोशिश करें, आपकी समस्या का समाधान हो जाएगा!


1

मुझे एक भटका उद्धरण चिह्न के साथ इस त्रुटि का सामना करना पड़ा है। मैं मैपिंग सॉफ़्टवेयर का उपयोग करता हूं जो कॉमा-सीमांकित फ़ाइलों को निर्यात करते समय पाठ आइटम के आसपास उद्धरण चिह्न डाल देगा। पाठ जो उद्धरण चिह्नों का उपयोग करता है (जैसे '= फीट और "= इंच) तब समस्याग्रस्त हो सकता है जब वह सीमांकक टकराव को प्रेरित करता है। इस उदाहरण पर विचार करें जो नोट करता है कि 5-इंच अच्छी तरह से लॉग प्रिंट खराब है:

UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""

कार्यों में एक रिंच फेंकने के 5"लिए शॉर्टहैंड के रूप में उपयोग करना 5 inch। एक्सेल केवल अतिरिक्त उद्धरण चिह्न को बंद कर देगा, लेकिन पंडस error_bad_lines=Falseऊपर उल्लिखित तर्क के बिना टूट जाता है।


1

जहाँ तक मैं बता सकता हूँ, और आपकी फ़ाइल पर एक नज़र डालने के बाद, समस्या यह है कि जिस csv फ़ाइल को आप लोड करने का प्रयास कर रहे हैं, उसमें कई सारणियाँ हैं। खाली लाइनें हैं, या लाइनें जिनमें तालिका शीर्षक हैं। इस Stackoverflow जवाब पर एक नज़र रखने की कोशिश करें । यह दिखाता है कि उस प्रोग्राम को कैसे हासिल किया जाए।

ऐसा करने के लिए एक और गतिशील दृष्टिकोण जो सीएसवी मॉड्यूल का उपयोग करना होगा , एक बार में हर एक पंक्ति को पढ़ें और यदि पंक्ति (शीर्षक / हैडर / मान / रिक्त) है, तो यह पता लगाने के लिए पवित्रता जांच / नियमित अभिव्यक्ति करें। आपके पास इस दृष्टिकोण के साथ एक और लाभ है, कि आप अपने डेटा को वांछित रूप में अजगर वस्तुओं में विभाजित / जोड़ सकते हैं / एकत्र कर सकते हैं।

सभी का सबसे आसान पैंडस फ़ंक्शन का उपयोग pd.read_clipboard()मैन्युअल रूप से तालिका में क्लिपबोर्ड पर चयन और कॉपी करने के बाद होगा, यदि आप एक्सेल या कुछ में सीएसवी खोल सकते हैं।

अप्रासंगिक :

इसके अतिरिक्त, आपकी समस्या के लिए अप्रासंगिक, लेकिन क्योंकि किसी ने भी इस बात का उल्लेख नहीं किया था: कुछ डेटासेट जैसे seeds_dataset.txtयूसीआई से लोड करते समय मेरे पास यही मुद्दा था । मेरे मामले में, त्रुटि हो रही थी क्योंकि कुछ विभाजकों के पास एक सच्चे टैब की तुलना में अधिक व्हाट्सएप था \t। उदाहरण के लिए निम्नलिखित में पंक्ति 3 देखें

14.38   14.21   0.8951  5.386   3.312   2.462   4.956   1
14.69   14.49   0.8799  5.563   3.259   3.586   5.219   1
14.11   14.1    0.8911  5.42    3.302   2.7     5       1

इसलिए, के \t+बजाय विभाजक पैटर्न में उपयोग करें \t

data = pd.read_csv(path, sep='\t+`, header=None)

1

मेरे मामले में, यह इसलिए है क्योंकि csv फ़ाइल की पहली और अंतिम दो पंक्तियों का प्रारूप फ़ाइल की मध्य सामग्री से अलग है।

तो मैं क्या करता हूं एक स्ट्रिंग के रूप में सीएसवी फ़ाइल खोलें, स्ट्रिंग की सामग्री को पार्स करें, फिर read_csvडेटाफ़्रेम प्राप्त करने के लिए उपयोग करें।

import io
import pandas as pd

file = open(f'{file_path}/{file_name}', 'r')
content = file.read()

# change new line character from '\r\n' to '\n'
lines = content.replace('\r', '').split('\n')

# Remove the first and last 2 lines of the file
# StringIO can be considered as a file stored in memory
df = pd.read_csv(StringIO("\n".join(lines[2:-2])), header=None)

1

मेरे मामले में विभाजक डिफ़ॉल्ट नहीं था "," लेकिन टैब।

pd.read_csv(file_name.csv, sep='\\t',lineterminator='\\r', engine='python', header='infer')

नोट: "\ t" कुछ स्रोतों द्वारा सुझाए गए अनुसार काम नहीं किया। "\\ t" की आवश्यकता थी।


0

मेरे पास एक समान त्रुटि थी और मुद्दा यह था कि मैंने अपनी सीएसवी फ़ाइल में कुछ बच गए उद्धरणों को छोड़ दिया था और उचित रूप से एस्कैपचर पैरामीटर सेट करने की आवश्यकता थी।

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