पंडों के साथ पंडों में CSV फ़ाइल पढ़ते समय UnicodeDecodeError


412

मैं एक प्रोग्राम चला रहा हूं, जो 30,000 समान फाइलों को प्रोसेस कर रहा है। उनमें से एक यादृच्छिक संख्या इस त्रुटि को रोक रही है और उत्पादन कर रही है ...

   File "C:\Importer\src\dfman\importer.py", line 26, in import_chr
     data = pd.read_csv(filepath, names=fields)
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 400, in parser_f
     return _read(filepath_or_buffer, kwds)
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 205, in _read
     return parser.read()
   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 728, in pandas.parser.TextReader._read_low_memory (pandas\parser.c:6964)
   File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandas\parser.c:7780)
   File "parser.pyx", line 890, in pandas.parser.TextReader._convert_column_data (pandas\parser.c:8793)
   File "parser.pyx", line 950, in pandas.parser.TextReader._convert_tokens (pandas\parser.c:9484)
   File "parser.pyx", line 1026, in pandas.parser.TextReader._convert_with_dtype (pandas\parser.c:10642)
   File "parser.pyx", line 1046, in pandas.parser.TextReader._string_convert (pandas\parser.c:10853)
   File "parser.pyx", line 1278, in pandas.parser._string_box_utf8 (pandas\parser.c:15657)
 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 6: invalid    continuation byte

इन फ़ाइलों का स्रोत / निर्माण सभी एक ही स्थान से आते हैं। आयात को आगे बढ़ाने के लिए इसे सही करने का सबसे अच्छा तरीका क्या है?

जवाबों:


821

read_csvencodingविभिन्न स्वरूपों में फ़ाइलों से निपटने के लिए एक विकल्प लेता है। मैं ज्यादातर का उपयोग read_csv('file', encoding = "ISO-8859-1"), या वैकल्पिक रूप encoding = "utf-8"पढ़ने, और आम तौर पर के लिए utf-8के लिए to_csv

आप इसके बजाय कई aliasविकल्पों में से एक का उपयोग कर सकते हैं (देखें अजगर डॉक्स , कई अन्य एनकोडिंग के लिए भी जिनका आप सामना कर सकते हैं)।'latin''ISO-8859-1'

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

एन्कोडिंग का पता लगाने के लिए (यह मानते हुए कि फ़ाइल में गैर-एससीआई वर्ण हैं), आप enca( मैन पेज देखें ) file -i( या लिनक्स) या file -I(ओएक्सएक्स) ( मैन पेज देखें) का उपयोग कर सकते हैं ।


7
चूंकि यह एक विंडोज इश्यू है, इसलिए cp1252इसे प्राथमिकता दी जा सकती है iso-8859-1
tzot

7
धन्यवाद pd.read_csv('immigration.csv', encoding = "ISO-8859-1", engine='python')मेरे लिए काम किया
मोना जलाल

8
आँख बंद करके एक निश्चित एन्कोडिंग को सही न मानें क्योंकि कोई अपवाद नहीं है। आपको स्ट्रिंग्स को देखने और यह पता लगाने की आवश्यकता है कि क्या व्याख्या समझ में आती है। उदाहरण के लिए, यदि आपको "hors d'"uvre" के बजाय "hors d'½uvre" मिलता है, तो आपको संभवतः ISO-8859-1 से ISO-8859-15 पर स्विच करना होगा।
जोकिम वैगनर

6
मेरे लिए एन्कोडिंग था ANSI। यह पता लगाने के लिए, मैंने notepadतब क्लिक में सीएसवी खोला save as, वहां यह सेव बटन के बगल में एन्कोडिंग दिखाता है।
वैभव विशाल


68

सभी समाधानों में सबसे सरल:

import pandas as pd
df = pd.read_csv('file_name.csv', engine='python')

वैकल्पिक समाधान:

  • उदात्त पाठ संपादक में सीएसवी फ़ाइल खोलें ।
  • फ़ाइल को utf-8 प्रारूप में सहेजें।

उदात्त में, फ़ाइल पर क्लिक करें -> एन्कोडिंग के साथ सहेजें -> UTF-8

फिर, आप अपनी फ़ाइल को हमेशा की तरह पढ़ सकते हैं:

import pandas as pd
data = pd.read_csv('file_name.csv', encoding='utf-8')

और अन्य विभिन्न एन्कोडिंग प्रकार हैं:

encoding = "cp1252"
encoding = "ISO-8859-1"

11
सवाल बताते हैं कि ऐसी 30,000 फाइलें हैं। प्रत्येक फ़ाइल को मैन्युअल रूप से खोलना व्यावहारिक नहीं होगा।
कीथ

4
कम से कम एक फ़ाइल के लिए, यह मेरे लिए काम करने लगा!
apil.tamang

सी इंजन स्पष्ट रूप से अधिक क्षमाशील है जो इसे स्वीकार करता है। किसी विशेष CSV फ़ाइल के लिए, जो थ्रो के encoding='iso-8859-1'बजाय का उपयोग करके ठीक से खुलती है । engine='python'_csv.Error: field larger than field limit (131072)
ग्रेग बेकन

1
एन्कोडिंग के साथ बचत का उपयोग करने के लिए वैकल्पिक समाधान वास्तव में उपयोगी था! VSCode stackoverflow.com/questions/30082741/… के
Brownmagik352

20

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

  1. आप एन्कोडिंग को जानते हैं, और फ़ाइल में कोई एन्कोडिंग त्रुटि नहीं है। महान: आपके पास एन्कोडिंग निर्दिष्ट करने के लिए बस है:

    file_encoding = 'cp1252'        # set file_encoding to the file encoding (utf8, latin1, etc.)
    pd.read_csv(input_file_and_path, ..., encoding=file_encoding)
  2. आप एन्कोडिंग प्रश्नों से परेशान नहीं होना चाहते हैं, और केवल उस लानत फ़ाइल को लोड करना चाहते हैं, भले ही कुछ पाठ फ़ील्ड में कचरा हो। ठीक है, आपको केवल Latin1एन्कोडिंग का उपयोग करना होगा क्योंकि यह किसी भी संभावित बाइट को इनपुट के रूप में स्वीकार करता है (और इसे उसी कोड के यूनिकोड वर्ण में परिवर्तित करता है):

    pd.read_csv(input_file_and_path, ..., encoding='latin1')
  3. आप जानते हैं कि अधिकांश फ़ाइल एक विशिष्ट एन्कोडिंग के साथ लिखी जाती है, लेकिन इसमें एन्कोडिंग त्रुटियाँ भी होती हैं। एक वास्तविक दुनिया उदाहरण एक UTF8 फ़ाइल है जिसे एक गैर utf8 संपादक के साथ संपादित किया गया है और जिसमें एक अलग एन्कोडिंग के साथ कुछ लाइनें हैं। पंडों के पास एक विशेष त्रुटि प्रसंस्करण के लिए कोई प्रावधान नहीं है, लेकिन पायथन openफ़ंक्शन में ( पायथन 3 को मानते हुए) है, और read_csvएक फ़ाइल को ऑब्जेक्ट के रूप में स्वीकार करता है। यहां उपयोग करने के लिए विशिष्ट त्रुटियां पैरामीटर हैं, 'ignore'जो सिर्फ आक्रामक बाइट्स या (आईएमएचओ बेहतर) को दबाती हैं, जो 'backslashreplace'अपने पायथन के बैकस्लेस्ड एस्केप अनुक्रम द्वारा आक्रामक बाइट्स की जगह लेती हैं:

    file_encoding = 'utf8'        # set file_encoding to the file encoding (utf8, latin1, etc.)
    input_fd = open(input_file_and_path, encoding=file_encoding, errors = 'backslashreplace')
    pd.read_csv(input_fd, ...)

1
देर से जवाब, लेकिन एक नकली सवाल पर लक्षित ...
सर्ज बलेस्टा

14
with open('filename.csv') as f:
   print(f)

इस कोड को निष्पादित करने के बाद आपको 'filename.csv' की एन्कोडिंग मिलेगी, फिर निम्नलिखित के रूप में कोड निष्पादित करें

data=pd.read_csv('filename.csv', encoding="encoding as you found earlier"

तुम वहाँ जाओ


6

मेरे मामले में, एक फाइल में USC-2 LE BOMएन्कोडिंग है, नोटपैड ++ के अनुसार। यह encoding="utf_16_le"अजगर के लिए है।

आशा है, यह किसी के लिए थोड़ा तेजी से उत्तर खोजने में मदद करता है।


4

मेरे मामले में यह अजगर 2.7 के लिए काम करता है:

data = read_csv(filename, encoding = "ISO-8859-1", dtype={'name_of_colum': unicode}, low_memory=False) 

और अजगर 3 के लिए, केवल:

data = read_csv(filename, encoding = "ISO-8859-1", low_memory=False) 

3

इंजन को निर्दिष्ट करने का प्रयास करें = 'अजगर'। इसने मेरे लिए काम किया लेकिन मैं अभी भी यह जानने की कोशिश कर रहा हूं कि क्यों।

df = pd.read_csv(input_file_path,...engine='python')

यह भी मेरे लिए काम किया। तो एन्कोडिंग = "आईएसओ-8859-1"। यह निश्चित रूप से एक एन्कोडिंग मुद्दा है। यदि एक विशेष चरित्र ANSI में एन्कोडेड है, जैसे कि एक दीर्घवृत्त वर्ण (अर्थात "..."), और आप इसे UTF-8 में पढ़ने का प्रयास करते हैं, तो आपको एक त्रुटि मिल सकती है। लब्बोलुआब यह है कि आपको पता होना चाहिए कि फ़ाइल किस एन्कोडिंग के साथ बनाई गई थी।
सीन मैककार्थी

3

मैं एक अद्यतन समाधान और स्पष्टीकरण प्रदान करने के लिए एक उत्तर पोस्ट कर रहा हूं कि यह समस्या क्यों हो सकती है। मान लें कि आपको यह डेटा किसी डेटाबेस या एक्सेल वर्कबुक से मिल रहा है। यदि आपके पास विशेष वर्ण हैं La Cañada Flintridge city, जैसे कि जब तक आप UTF-8एन्कोडिंग का उपयोग करके डेटा निर्यात नहीं कर रहे हैं , तो आप त्रुटियों को पेश करने जा रहे हैं। La Cañada Flintridge cityबन जाएगा La Ca\xf1ada Flintridge city। यदि आप pandas.read_csvबिना किसी समायोजन के डिफ़ॉल्ट पैरामीटर का उपयोग कर रहे हैं , तो आप निम्न त्रुटि करेंगे

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 5: invalid continuation byte

सौभाग्य से, कुछ समाधान हैं।

विकल्प 1 , निर्यात को ठीक करें। UTF-8एन्कोडिंग का उपयोग करना सुनिश्चित करें ।

विकल्प 2 , अगर निर्यात समस्या को ठीक करने आप के लिए उपलब्ध नहीं है, और आप उपयोग करने की जरूरत है pandas.read_csv, के लिए, निम्न पैरामीटर शामिल करना न भूलें engine='python'। डिफ़ॉल्ट रूप से, पांडा उपयोग करता है engine='C'जो बड़ी साफ फ़ाइलों को पढ़ने के लिए महान है, लेकिन अगर कुछ भी अप्रत्याशित आता है तो दुर्घटनाग्रस्त हो जाएगा। मेरे अनुभव में, सेटिंग encoding='utf-8'ने कभी यह तय नहीं किया है UnicodeDecodeError। इसके अलावा, आपको उपयोग करने की आवश्यकता नहीं है errors_bad_lines, हालांकि, यह अभी भी एक विकल्प है यदि आपको वास्तव में इसकी आवश्यकता है।

pd.read_csv(<your file>, engine='python')

विकल्प 3: समाधान व्यक्तिगत रूप से मेरा पसंदीदा समाधान है। वेनिला पायथन का उपयोग करके फ़ाइल पढ़ें।

import pandas as pd

data = []

with open(<your file>, "rb") as myfile:
    # read the header seperately
    # decode it as 'utf-8', remove any special characters, and split it on the comma (or deliminator)
    header = myfile.readline().decode('utf-8').replace('\r\n', '').split(',')
    # read the rest of the data
    for line in myfile:
        row = line.decode('utf-8', errors='ignore').replace('\r\n', '').split(',')
        data.append(row)

# save the data as a dataframe
df = pd.DataFrame(data=data, columns = header)

आशा है कि यह लोगों को पहली बार इस मुद्दे का सामना करने में मदद करेगा।


2

यह थोड़ी देर के साथ संघर्ष किया और सोचा कि मैं इस सवाल पर पोस्ट करूंगा क्योंकि यह पहला खोज परिणाम है। encoding="iso-8859-1"पांडा को टैग जोड़ने से read_csvकाम नहीं चला, और न ही कोई अन्य एन्कोडिंग हुई, जो यूनिकोडडबेलरप्रिंट दे रहा है।

यदि आप एक फ़ाइल हैंडल पास कर रहे हैं, तो आपको फ़ाइल को खोलने पर विशेषता pd.read_csv(),डालने की आवश्यकता है encoding, अंदर नहीं read_csv। दृष्टि में स्पष्ट, लेकिन नीचे ट्रैक करने के लिए एक सूक्ष्म त्रुटि।


1

यह उत्तर CSV एन्कोडिंग समस्याओं के लिए सभी को पकड़ने वाला लगता है। यदि आपको इस तरह से अपने हेडर के साथ एक अजीब एन्कोडिंग समस्या हो रही है:

>>> f = open(filename,"r")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('\ufeffid', '1'), ... ])

फिर आपके CSV फ़ाइल की शुरुआत में एक बाइट ऑर्डर मार्क (BOM) अक्षर है। यह उत्तर समस्या का समाधान करता है:

पायथन ने सीएसवी पढ़ा - बीओएम पहली कुंजी में एम्बेडेड है

समाधान के साथ CSV को लोड करना है encoding="utf-8-sig":

>>> f = open(filename,"r", encoding="utf-8-sig")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('id', '1'), ... ])

उम्मीद है कि यह किसी की मदद करता है।


1

मैं इस पुराने धागे को अपडेट पोस्ट कर रहा हूं। मुझे एक समाधान मिला जो काम करता था, लेकिन प्रत्येक फ़ाइल को खोलने की आवश्यकता होती है। मैंने लिब्रे ऑफिस में अपनी सीएसवी फ़ाइल खोली, सेव अस> एडिट फ़िल्टर सेटिंग्स को चुना। ड्रॉप-डाउन मेनू में मैंने UTF8 एन्कोडिंग को चुना। तब मैं जोड़ा encoding="utf-8-sig"करने के लिए data = pd.read_csv(r'C:\fullpathtofile\filename.csv', sep = ',', encoding="utf-8-sig")

आशा है कि यह किसी की मदद करता है।


निसे, संपादन के लिए धन्यवाद। क्या आप बता सकते हैं कि आपने क्या बदला? मुझे कोई अंतर दिखाई नहीं देता।
tshirtdr1

1

मुझे ऑनलाइन बैंक से डाउनलोड किए गए सरलीकृत चीनी में CSV फ़ाइल खोलने में समस्या है, मैंने कोशिश की है latin1, मैंने कोशिश की है iso-8859-1, मैंने कोशिश की है cp1252, कोई फायदा नहीं हुआ।

लेकिन pd.read_csv("",encoding ='gbk')बस काम करता है।


1

कृपया जोड़ने का प्रयास करें

encoding='unicode_escape'

ये सहायता करेगा। मेरे लिए काम किया। इसके अलावा, सुनिश्चित करें कि आप सही सीमांकक और स्तंभ नामों का उपयोग कर रहे हैं।

आप फ़ाइल को जल्दी से लोड करने के लिए सिर्फ 1000 पंक्तियों को लोड करने के साथ शुरू कर सकते हैं।


0

मैं ज्यूपिटर-नोटबुक का उपयोग कर रहा हूं। और मेरे मामले में, यह फ़ाइल को गलत प्रारूप में दिखा रहा था। 'एन्कोडिंग' विकल्प काम नहीं कर रहा था। तो मैं utv-8 प्रारूप में csv को सहेजता हूं, और यह काम करता है।


0

इसे इस्तेमाल करे:

import pandas as pd
with open('filename.csv') as f:
    data = pd.read_csv(f)

ऐसा लगता है कि यह तर्क के माध्यम से स्पष्ट रूप से व्यक्त किए बिना एन्कोडिंग का ध्यान रखेगा


0

पांडा के पास जाने से पहले एन्कोडिंग की जाँच करें। यह आपको धीमा कर देगा, लेकिन ...

with open(path, 'r') as f:
    encoding = f.encoding 

df = pd.read_csv(path,sep=sep, encoding=encoding)

अजगर में 3.7


0

एक और महत्वपूर्ण मुद्दा जिसका मैंने सामना किया, जिसके परिणामस्वरूप एक ही त्रुटि थी:

_values = pd.read_csv("C:\Users\Mujeeb\Desktop\file.xlxs")

^ इस लाइन के परिणामस्वरूप त्रुटि हुई क्योंकि मैं read_csv()विधि का उपयोग कर एक एक्सेल फाइल पढ़ रहा हूं । read_excel()पढ़ने के लिए उपयोग करें .xlxs


वाह, बाकी सभी मुद्दों को एन्कोडिंग के बारे में बात कर रहे हैं। लगता है कि मेरा मुद्दा अजीब था।
मुजीब इशाक

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