यूनिकोडडॉफॉर्सेट: 'utf8' कोडेक 0xa5 को 0 की स्थिति में बाइट को डिकोड नहीं कर सकता है: बाइट से अमान्य शुरुआत


188

मैं Python-2.6 CGIस्क्रिप्ट का उपयोग कर रहा हूं, लेकिन सर्वर लॉग में इस त्रुटि को करते हुए पाया json.dumps(),

Traceback (most recent call last):
  File "/etc/mongodb/server/cgi-bin/getstats.py", line 135, in <module>
    print json.dumps(​​__getdata())
  File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa5 in position 0: invalid start byte

यहाँ,

​__get​data()फ़ंक्शन देता है dictionary {}

इस प्रश्न को पोस्ट करने से पहले मैंने इस प्रश्न का उल्लेख किया है।


अद्यतन

निम्नलिखित पंक्ति JSON एनकोडर को नुकसान पहुंचा रही है,

now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps({'current_time': now}) // this is the culprit

मुझे इसके लिए एक अस्थायी निर्धारण मिला

print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })

लेकिन मुझे यकीन नहीं है कि यह करने का सही तरीका है।


1
ऐसा लगता है कि आपके पास शब्दकोश में कुछ स्ट्रिंग डेटा हैं जिन्हें एन्कोडेड / डीकोड नहीं किया जा सकता है। इसमें क्या है dict?
mgilson

@mgilson yup मास्टर मैं इस मुद्दे को समझ गया, लेकिन डोनो कैसे इससे निपटने के लिए .. dictहैlist, dict, python timestamp value
दीपक इंगोले

1
@Pilot - वास्तव में नहीं। असली समस्या कहीं दब गई है __getdata। मुझे नहीं पता कि आपको एक गैर-डिकोडेबल चरित्र क्यों मिल रहा है। आप इसे काम करने के लिए डिक्टेट पर पैच के साथ आने की कोशिश कर सकते हैं, लेकिन वे ज्यादातर बाद में और अधिक समस्याओं के लिए पूछ रहे हैं। मैं यह देखने की कोशिश कर रहा हूं कि गैर-अस्सी चरित्र कहां है। फिर यह पता लगाएं कि उस क्षेत्र की गणना कैसे की गई / सेट की गई और वहां से पिछड़े हुए हैं।
एमजीसिलसन


1
मेरे पास .csv फ़ाइल को पढ़ने की कोशिश करते समय वही त्रुटि थी, जिसमें कुछ गैर-असि अक्षर थे। उन पात्रों को हटाने (जैसा कि नीचे सुझाव दिया गया है) ने इस मुद्दे को हल किया।
दिमित्री आर। स्टार्सोन

जवाबों:


87

त्रुटि इसलिए है क्योंकि डिक्शनरी में कुछ गैर-एससीआई चरित्र है और इसे इनकोड / डिकोड नहीं किया जा सकता है। इस त्रुटि से बचने का एक सरल तरीका यह है कि encode()फ़ंक्शन के साथ इस तरह के तार को एनकोड किया जाए (यदि aगैर-असिसी चरित्र के साथ स्ट्रिंग है):

a.encode('utf-8').strip()

2
चूंकि UTF-8 वापस oldschool 7-bit ASCII के साथ संगत है, इसलिए आपको सब कुछ एनकोड करना चाहिए। 7-बिट ASCII रेंज के पात्रों के लिए यह एन्कोडिंग एक पहचान मानचित्रण होगा।
तेदुस्ज़ ए। कदलोबोस्की

29
यह वास्तविक स्पष्ट नहीं लगता है। CSV फ़ाइल आयात करते समय आप इस कोड का उपयोग कैसे करते हैं?
डेव

एक sqlalchemy क्वेरी को निष्पादित करते समय मेरे लिए एक ही मुद्दा दिखाई देता है, मैं क्वेरी को कैसे सांकेतिक शब्दों में बदलना होगा (कोई .encode नहीं है, क्योंकि यह एक स्ट्रिंग नहीं है)?
c8999c 3f964f64

129

मैंने read_csv()कमांड में एक अलग कोडेक पैकेज को परिभाषित करके बस इसे स्विच किया :

encoding = 'unicode_escape'

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

import pandas as pd
data = pd.read_csv(filename, encoding= 'unicode_escape')

1
केवल तभी यदि आप उपयोग कर रहे हैंpandas
Valeriy

1
क्षमा करें, यह काम नहीं कर रहा था, मुझे फिर से वही त्रुटि मिली। लेकिन जब मैंने ('filename.csv', इंजन = 'पायथन') का उपयोग किया। यह काम किया।
बसवराज_

117

नीचे दिए गए कोड स्निपेट को आज़माएं:

with open(path, 'rb') as f:
  text = f.read()

7
मैं इसके rबजाय था rb। जोड़ने के लिए अनुस्मारक के लिए धन्यवाद b!
पॉल

1
डिफ़ॉल्ट openफ़ंक्शन द्वारा 'r' को केवल मोड के रूप में पढ़ा जाता है। rbबाइनरी मोड पढ़ने के लिए खड़ा है।
शिवा

39

आपके स्ट्रिंग में एक गैर asciiचरित्र है जो इसमें एन्कोडेड है।

नहीं के साथ डिकोड करने के लिए सक्षम किया जा रहा utf-8है कि आप अपने कोड में अन्य एन्कोडिंग का उपयोग करने के लिए आवश्यक गया है हो सकता है। उदाहरण के लिए:

>>> 'my weird character \x96'.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 19: invalid start byte

इस मामले में, एन्कोडिंग windows-1252तो आपको करना है:

>>> 'my weird character \x96'.decode('windows-1252')
u'my weird character \u2013'

अब आपके पास Unicode, आप सुरक्षित रूप से इनकोड कर सकते हैं utf-8


1
मैंने एक सरल पृष्ठ बनाया है जो कुछ अप्रत्याशित "मिस्ट्री बाइट्स" के एन्कोडिंग को स्थापित करने में मदद कर सकता है; tripleee.github.io/8bit
ट्रिपल

34

पढ़ने पर csv, मैंने एक एन्कोडिंग विधि जोड़ी:

import pandas as pd
dataset = pd.read_csv('sample_data.csv', header= 0,
                        encoding= 'unicode_escape')

16

अपने कोड के शीर्ष पर डिफ़ॉल्ट एनकोडर सेट करें

import sys
reload(sys)
sys.setdefaultencoding("ISO-8859-1")

मुझे लगता है कि python3 में sys मॉड्यूल में सेटडेफॉल्टेंकोडिंग नहीं है!
अनवर हुसैन

14

2018-05 तक इसे सीधे तौर decodeपर कम से कम पायथन 3 के लिए संभाला जाएगा ।

मैं नीचे दिए गए स्निपेट का उपयोग कर रहा हूं invalid start byteऔर invalid continuation byteत्रुटियों को टाइप करता हूं । जोड़ना errors='ignore'मेरे लिए तय की।

with open(out_file, 'rb') as f:
    for line in f:
        print(line.decode(errors='ignore'))

1
बेशक, यह चुपचाप जानकारी को त्याग देता है। एक बेहतर समाधान यह पता लगाना है कि वहां क्या होना चाहिए, और मूल समस्या को ठीक करना।
ट्रिपल

14

@Aronpenne और @Soumyaansh से प्रेरित

f = open("file.txt", "rb")
text = f.read().decode(errors='replace')

मुझे "एट्रीब्यूटरोर: 'स्ट्रैट' ऑब्जेक्ट में कोई विशेषता 'डीकोड' नहीं मिली।" निश्चित नहीं कि क्या गलत हुआ?
विक्टर वोंग

क्या आपने बी को "आरबी" में शामिल किया? B फाइल को फॉर्मेट के रूप में खोलने के लिए है। यदि आप r का उपयोग करते हैं तो यह स्ट्रिंग है, और इसमें डिकोड शामिल नहीं है।
11

14

इस समाधान ने मेरे लिए काम किया:

import pandas as pd
data = pd.read_csv("training.csv", encoding = 'unicode_escape')

11

सरल उपाय:

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

3
धन्यवाद कि मदद की!
रूबेन

ग्लैड @ मदद करने के लिए @ रुबेन
गिल

2
धन्यवाद, इसने मेरी मदद की। मैं पांडा पर काम कर रहा था। धन्यवाद फिर से
बसवराज_ २

@Basavaraj_S की मदद करने के लिए खुश
गिल

1
एकमात्र समाधान जो मेरे यहाँ प्रस्तुत सभी के लिए काम करता है।
लुन्स्को

7

निम्नलिखित पंक्ति JSON एनकोडर को नुकसान पहुंचा रही है,

now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps({'current_time': now}) // this is the culprit

मुझे इसके लिए एक अस्थायी निर्धारण मिला

print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })

इसे अस्थायी फिक्स के रूप में चिह्नित करना (निश्चित रूप से ऐसा नहीं है)।


5

यदि उपरोक्त विधियां आपके लिए काम नहीं कर रही हैं, तो आप स्वयं csv फ़ाइल के एन्कोडिंग को बदलना चाह सकते हैं।

एक्सेल का उपयोग करना:

  1. एक्सेल का उपयोग करके सीएसवी फ़ाइल खोलें
  2. "फ़ाइल मेनू" विकल्प पर जाएँ और "इस रूप में सहेजें" पर क्लिक करें
  3. फ़ाइल को सहेजने के लिए किसी स्थान का चयन करने के लिए "ब्राउज़ करें" पर क्लिक करें
  4. इच्छित फ़ाइल नाम दर्ज करें
  5. CSV (कोमा सीमांकित) (* .csv) विकल्प चुनें
  6. "टूल" ड्रॉप-डाउन बॉक्स पर क्लिक करें और "वेब विकल्प" पर क्लिक करें
  7. "एन्कोडिंग" टैब के तहत, "ड्रॉप-आउट सूची के रूप में इस दस्तावेज़ को सहेजें" से यूनिकोड (UTF-8) विकल्प चुनें
  8. फ़ाइल सहेजें

नोटपैड का उपयोग करना:

  1. नोटपैड का उपयोग करके सीएसवी फ़ाइल खोलें
  2. "फ़ाइल"> "इस रूप में सहेजें" विकल्प पर नेविगेट करें
  3. अगला, फ़ाइल के लिए स्थान का चयन करें
  4. सभी फ़ाइल ( ) के रूप में प्रकार के रूप में सहेजें विकल्प चुनें
  5. .Csv एक्सटेंशन के साथ फ़ाइल नाम निर्दिष्ट करें
  6. "एन्कोडिंग" ड्रॉप-डाउन सूची से, UTF-8 विकल्प चुनें।
  7. फ़ाइल को सहेजने के लिए सहेजें पर क्लिक करें

ऐसा करने से, आपको UnicodeCodeError का सामना किए बिना सीएसवी फ़ाइलों को आयात करने में सक्षम होना चाहिए।


2

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

मैंने एक साथ घंटों बिताए, जबकि समाधान यह सरल था। उस फ़ाइल को CSV के रूप में उस निर्देशिका में निर्यात करें जहां एनाकोंडा या आपके क्लासिफायर टूल स्थापित हैं और प्रयास करें।


2

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

utf-8 डिफ़ॉल्ट है।

iso8859-1 पश्चिमी यूरोप के लिए भी लोकप्रिय है।

उदाहरण के लिए: bytes_obj.decode('iso8859-1')

देखें: डॉक्स


1
अंधाधुंध अनुमान लगाने से एन्कोडिंग अधिक त्रुटियों का उत्पादन करने की संभावना है। Iso8859-1 या cp1251 इत्यादि का चयन करना वास्तव में बिना जाने कि कौन सी फाइल एन्कोडिंग का उपयोग करता है लक्षण को हटा देगा, लेकिन यदि आपने गलत अनुमान लगाया है तो कचरा उत्पन्न करेगा। यदि यह केवल कुछ बाइट्स है, तो आपको नोटिस करने और वास्तविक त्रुटि को ठीक करने में कई साल लग सकते हैं ।
18

0

A5 (येन ¥) या 96 (एन-डैश ) को डिकोड करने के तरीकों की तलाश करने के बजाय , MySQL को बताएं कि आपका क्लाइंट "latin1" एन्कोड किया गया है, लेकिन आप डेटाबेस में "utf8" चाहते हैं।

UTF-8 पात्रों के साथ परेशानी में विवरण देखें ; मैं जो देखता हूं वह वह नहीं है जो मैंने संग्रहीत किया है

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