यूनिकोडडब्लॉस्टर में "लाइन के लिए ..." परिणाम: 'utf-8' कोडेक बाइट को डिकोड नहीं कर सकता है


214

यहाँ मेरा कोड है,

for line in open('u.item'):
#read each line

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

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

मैंने इसे हल करने और खुले में एक अतिरिक्त पैरामीटर जोड़ने की कोशिश की (), कोड जैसा दिखता है;

for line in open('u.item', encoding='utf-8'):
#read each line

लेकिन फिर से वही त्रुटि देता है। तब मुझे क्या करना चाहिए! कृपया मदद कीजिए।


3
बुरी तरह से एन्कोडेड डेटा मुझे लगता है।
एंड्रियास जंग

9
या यूटीएफ -8 डेटा ही नहीं।
मार्क टोलेनन


अजगर 2.7 के बजाय अजगर 3 का उपयोग करते समय हमारे पास msgpack के साथ यह त्रुटि थी। हमारे लिए, एक्शन का कोर्स अजगर 2.7 के साथ काम करना था।
जेसी डब्लू कॉलिन्स

जवाबों:


403

जैसा कि मार्क रैनसम द्वारा सुझाया गया था, मुझे उस समस्या के लिए सही एन्कोडिंग मिला। एन्कोडिंग "आईएसओ-8859-1" था, इसलिए इसके open("u.item", encoding="utf-8")साथ प्रतिस्थापित open('u.item', encoding = "ISO-8859-1")करने से समस्या हल हो जाएगी।


8
निहितार्थ (PEP 20) की तुलना में स्पष्ट है।
Ioannis Filippidis

6
चाल यह है कि ISO-8859-1 या Latin_1 8 बिट वर्ण सेट है, इस प्रकार सभी कचरे का एक वैध मूल्य है। शायद उपयोग करने योग्य नहीं है, लेकिन अगर आप उपेक्षा करना चाहते हैं!
Kjeld Flarup

1
मेरे पास एक ही मुद्दा था यूनिकोडडॉफ़ोरेट: 'utf-8' कोडक 0xd0 को 32 की स्थिति में बाइट को डिकोड नहीं कर सकता: अमान्य निरंतरता बाइट। मैंने ayi cli को स्थापित करने के लिए अजगर 3.6.5 का उपयोग किया। और जब मैंने aws --version की कोशिश की तो यह इस त्रुटि के साथ विफल हो गया। इसलिए मुझे /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/configparser.py संपादित करना पड़ा और कोड को निम्न डीईएफ़ रीड (स्वयं, फ़ाइलनाम, एन्कोडिंग = "ISO-8859-1" में
вгений Коптюбенко

3
एन्कोडिंग का पता लगाने का एक स्वचालित तरीका है?
ऑरेंजशर्बीट

5
@OrangeSherbet मैंने प्रयोग करके पता लगाया chardet। यहाँ एक लाइनर (बाद import chardet) है chardet.detect(open(in_file, 'rb').read())['encoding']:। विवरण के लिए इस उत्तर को देखें: stackoverflow.com/a/3323810/615422
वर्टिगो री

51

मेरे लिए भी काम किया, ISO 8859-1 बहुत कुछ बचा रहा है, हाहा, मुख्य रूप से अगर स्पीच रिकग्निशन एपीआई का उपयोग कर रहा है

उदाहरण:

file = open('../Resources/' + filename, 'r', encoding="ISO-8859-1");

4
आप सही हो सकते हैं कि ओपी आईएसओ 8859-1 पढ़ रहा है, जैसा कि त्रुटि संदेश में 0xe9 (é) से घटाया जा सकता है, लेकिन आपको यह बताना चाहिए कि आपका समाधान क्यों काम करता है। वाक् पहचान का संदर्भ एपीआई मदद नहीं करता है।
रॉल्फब्ली

5
अर्ध-बृहदान्त्र के साथ क्या है?
दायां पैर

29

आपकी फ़ाइल में वास्तव में utf-8 एन्कोडेड डेटा नहीं है, इसमें कुछ अन्य एन्कोडिंग हैं। समझें कि वह एन्कोडिंग क्या है और इसका उपयोग करेंopen कॉल करें।

उदाहरण के लिए Windows-1252 एन्कोडिंग 0xe9चरित्र होगा é


4
तो, मैं कैसे पता लगा सकता हूं कि एन्कोडिंग क्या है! मैं linux
SujitS

4
ऐसा करने का कोई तरीका नहीं है जो हमेशा काम करता है, लेकिन इस सवाल का जवाब देखें: stackoverflow.com/questions/436220/…
RemcoGerlich

20

पंडों का उपयोग करके इसे पढ़ने की कोशिश करें

pd.read_csv('u.item', sep='|', names=m_cols , encoding='latin-1')

सुनिश्चित नहीं हैं कि आप पंडों का सुझाव क्यों दे रहे हैं। समाधान सही एन्कोडिंग सेट कर रहा है, जिसे आपने यहाँ पर प्रस्तुत किया है।
एलेस्टेयर मैककॉर्मैक

12

यदि आप Python 2निम्नलिखित समाधान का उपयोग कर रहे हैं:

import io
for line in io.open("u.item", encoding="ISO-8859-1"):
    # do something

क्योंकि encodingपैरामीटर के साथ काम नहीं करता है open(), आपको निम्न त्रुटि हो रही होगी:

TypeError: 'एन्कोडिंग' इस फ़ंक्शन के लिए एक अमान्य कीवर्ड तर्क है

1
लेकिन यह संस्करण 3 है
सुजीत

1
हाँ मुझे पता है। मैंने सोचा कि यह उपयोग करने वाले लोगों के लिए उपयोगी हो सकता हैPython 2
Jeril

मेरे लिए Python3 में भी काम किया
fenkerbb

2
यदि आप कुछ आसान याद रखना चाहते हैं, तो 'ISO-8859-1'इसे 'latin-1'या के रूप में भी जाना जाता है 'latin1'
मैक्स कैंडोसिया

9

आप इस समस्या को हल कर सकते हैं:

for line in open(your_file_path, 'rb'):

'आरबी' बाइनरी मोड में फाइल पढ़ रहा है। और अधिक पढ़ें यहाँ । आशा है कि यह मदद करेगा!



2

यदि कोई व्यक्ति इन्हें ढूंढ रहा है, तो यह पायथन 3 में CSV फ़ाइल को परिवर्तित करने के लिए एक उदाहरण है:

try:
    inputReader = csv.reader(open(argv[1], encoding='ISO-8859-1'), delimiter=',',quotechar='"')
except IOError:
    pass

2

कभी-कभी जब open(filepath), जिसमें filepathवास्तव में नहीं है एक फ़ाइल सुनिश्चित करें कि फ़ाइल आप मौजूद खुला करने की कोशिश कर रहे हैं एक ही त्रुटि मिलती है, इसलिए सबसे पहले:

import os
assert os.path.isfile(filepath)

आशा है कि यह मदद करेगा।


1

आप इस तरह से कोशिश कर सकते हैं:

open('u.item', encoding='utf8', errors='ignore')

यह प्रश्न का उत्तर प्रदान नहीं करता है। किसी लेखक से स्पष्टीकरण मांगने या उसका अनुरोध करने के लिए, उनके पोस्ट के नीचे एक टिप्पणी छोड़ दें। - समीक्षा से
मार्टेनकैचर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.