पंडों के साथ टैब-सीमांकित फ़ाइल पढ़ना - विंडोज पर काम करता है, लेकिन मैक पर नहीं


95

मैं बिना किसी समस्या के विंडोज में पंडों / अजगर के साथ टैब-सीमांकित डेटा फ़ाइल पढ़ रहा हूं। डेटा फ़ाइल में पहले तीन पंक्तियों में नोट्स होते हैं और फिर हेडर के साथ अनुसरण किया जाता है।

df = pd.read_csv(myfile,sep='\t',skiprows=(0,1,2),header=(0))

अब मैं अपने मैक के साथ इस फाइल को पढ़ने की कोशिश कर रहा हूं। (मैक पर पायथन का उपयोग करते हुए मेरा पहली बार।) मुझे निम्न त्रुटि मिलती है।

pandas.parser.CParserError: Error tokenizing data. C error: Expected 1
fields in line 8, saw 39

यदि यह सेट error_bad_lines के लिए तर्क read_csv को झूठी , मुझे निम्नलिखित जानकारी है, जो अंतिम पंक्ति के अंत तक जारी है मिलता है।

Skipping line 8: expected 1 fields, saw 39
Skipping line 9: expected 1 fields, saw 125
Skipping line 10: expected 1 fields, saw 125
Skipping line 11: expected 1 fields, saw 125
Skipping line 12: expected 1 fields, saw 125
Skipping line 13: expected 1 fields, saw 125
Skipping line 14: expected 1 fields, saw 125
Skipping line 15: expected 1 fields, saw 125
Skipping line 16: expected 1 fields, saw 125
Skipping line 17: expected 1 fields, saw 125
...

क्या मुझे एन्कोडिंग तर्क के लिए एक मूल्य निर्दिष्ट करने की आवश्यकता है ? ऐसा लगता है जैसे मुझे नहीं करना चाहिए क्योंकि फ़ाइल को पढ़ना विंडोज पर ठीक काम करता है।


क्या आप दोनों OSes पर पांडा के सटीक समान संस्करण का उपयोग कर रहे हैं? क्या आप कुछ नमूना डेटा प्रदान कर सकते हैं जो मैक पर समस्या का चित्रण करता है?
जॉरिस

असंबंधित: क्या आप के बीच (0)और (0,)पायथन में अंतर को समझते हैं ? नोट: (0)है 0और (0,)है 0,- अल्पविराम एक टपल बनाता है (एक को छोड़कर), कोष्ठक नहीं।
JFS

क्या आपने कोशिश की है df = pd.read_table(myfile, skiprows=[0,1,2], header=0)?
pbreach

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

मुझे संदेह है कि आप जिस मुद्दे को अपने मैक के साथ देख रहे हैं वह लाइन टर्मिनेटर है। एक मैक पर बने स्प्रैडशीट विभिन्न पुस्तकालयों के साथ सभी प्रकार के मज़ेदार व्यवहार का कारण बन सकते हैं, जिसमें अजगर में सीरवी_ड्राइब लिबर
ब्रैड सैंडर्स

जवाबों:


153

सबसे बड़ी सुराग यह है कि सभी पंक्तियों को एक पंक्ति में लौटाया जा रहा है। यह इंगित करता है कि लाइन टर्मिनेटरों की अनदेखी की जा रही है या वे मौजूद नहीं हैं।

आप csv_reader के लिए लाइन टर्मिनेटर निर्दिष्ट कर सकते हैं। यदि आप एक मैक पर हैं, तो बनाई गई लाइनें \rलिनक्स मानक के बजाय समाप्त हो जाएंगी \nया बेहतर अभी भी निलंबित और खिड़कियों के बेल्ट दृष्टिकोण के साथ \r\n

pandas.read_csv(filename, sep='\t', lineterminator='\r')

आप अपने सभी डेटा को कोडेक्स पैकेज का उपयोग करके भी खोल सकते हैं। यह दस्तावेज़ लोडिंग गति की कीमत पर मजबूती बढ़ा सकता है।

import codecs

doc = codecs.open('document','rU','UTF-16') #open for reading with "universal" type set

df = pandas.read_csv(doc, sep='\t')

4
कोड के कोडेक्स टुकड़े को जोड़ने से मुझे मदद मिली। तब मुझे एहसास हुआ कि read_csv में एक पैरामिटर है जो ऐसा ही करता है। मैंने एन्कोडिंग = 'utf-16' जोड़ा है और इसने मेरे लिए समस्या को ठीक कर दिया है।
मिखाइल वेनकोव

5

एक और विकल्प engine='python'कमांड में जोड़ना होगाpandas.read_csv(filename, sep='\t', engine='python')

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