यूनिकोडडॉफॉर्सेट: 'एससीआई' कोडक 0xd1 को 2 की स्थिति में बाइट को डिकोड नहीं कर सकता: क्रम में नहीं (128)


107

मैं एक बहुत बड़े डेटासेट के साथ काम करने का प्रयास कर रहा हूं, जिसमें कुछ गैर-मानक चरित्र हैं। मुझे नौकरी की ऐनक के अनुसार यूनिकोड का उपयोग करने की आवश्यकता है, लेकिन मैं चकित हूं। (और संभवत: यह सब गलत है।)

मैं CSV का उपयोग करके खोलता हूं:

 15     ncesReader = csv.reader(open('geocoded_output.csv', 'rb'), delimiter='\t', quotechar='"')

फिर, मैं इसके साथ एनकोड करने का प्रयास करता हूं:

name=school_name.encode('utf-8'), street=row[9].encode('utf-8'), city=row[10].encode('utf-8'), state=row[11].encode('utf-8'), zip5=row[12], zip4=row[13],county=row[25].encode('utf-8'), lat=row[22], lng=row[23])

मैं लेट और एलएनजी को छोड़कर सब कुछ एन्कोडिंग कर रहा हूं क्योंकि उन लोगों को एक एपीआई के लिए भेजा जाना चाहिए। जब मैं डेटासेट को पार्स करने के लिए प्रोग्राम चलाता हूं तो मैं क्या उपयोग कर सकता हूं, मुझे निम्नलिखित ट्रैसबैक मिलता है।

Traceback (most recent call last):
  File "push_into_db.py", line 80, in <module>
    main()
  File "push_into_db.py", line 74, in main
    district_map = buildDistrictSchoolMap()
  File "push_into_db.py", line 32, in buildDistrictSchoolMap
    county=row[25].encode('utf-8'), lat=row[22], lng=row[23])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 2: ordinal not in range(128)

मुझे लगता है कि मुझे आपको बताना चाहिए कि मैं अजगर 2.7.2 का उपयोग कर रहा हूं, और यह django 1.4 पर एक ऐप बिल्ड का हिस्सा है। मैंने इस विषय पर कई पोस्ट पढ़े हैं, लेकिन उनमें से कोई भी सीधे लागू नहीं होता है। किसी भी प्रकार की सहायता सराहनीय होगी।

आप यह भी जानना चाह सकते हैं कि कुछ गैर-मानक वर्णों के कारण समस्या possibly और संभवतः know है।


1
आपकी मूल फ़ाइल एन्कोडिंग क्या है? मुझे लगता है कि आपको इसे मूल एन्कोडिंग के अनुसार डिकोड करना चाहिए और फिर utf 8 में बदलना चाहिए
जिओ

एन्कोडिंग का संभव डुप्लिकेट देता है "" ascii 'कोडेक चरित्र को सांकेतिक शब्दों में बदलना नहीं कर सकता ... क्रम में नहीं (128) " [संपादित करें] और [लगभग एक अरब अन्य, भी, मुझे यकीन है।]
कार्ल Knechtel

जवाबों:


152

यूनिकोड UTF-8 के बराबर नहीं है। बाद वाला पूर्व के लिए सिर्फ एक एन्कोडिंग है

आप इसे गलत तरीके से कर रहे हैं। आप UTF-8- एन्कोडेड डेटा पढ़ रहे हैं , इसलिए आपको UTF-8- एन्कोडेड स्ट्रिंग को एक यूनीकोड ​​स्ट्रिंग में डीकोड करना होगा।

तो बस के .encodeसाथ बदलें .decode, और यह काम करना चाहिए (यदि आपका .csv UTF-8-encoded है)।

हालांकि, शर्मिंदा होने की कोई बात नहीं है। मैं शर्त लगाता हूं कि 5 में से 3 प्रोग्रामर को पहली बार समझने में परेशानी हुई, अगर ज्यादा नहीं;)

अपडेट: अपने इनपुट डेटा है, तो नहीं UTF-8 एन्कोडेड है, तो आप के लिए है .decode()निश्चित रूप से उचित एन्कोडिंग, साथ। यदि कुछ भी नहीं दिया जाता है, तो अजगर ASCII को मानता है, जो स्पष्ट रूप से गैर-ASCII-वर्णों पर विफल होता है।


1
त्रुटि होने का कारण यह है कि पायथन अपने आप को डिफ़ॉल्ट एन्कोडिंग, एएससीआईआई से स्वचालित रूप से डिकोड करने की कोशिश कर रहा है, ताकि यह तब तक इसे एनकोड कर सके जैसा कि उसने निर्दिष्ट किया है, यूटीएफ -8 को। चूंकि डेटा ASCII मान्य नहीं है, इसलिए यह काम नहीं करता है।
एएफएफ

7
यकीन है, लेकिन अगर यह UTF8- एन्कोडेड डेटा है (जैसा कि मुझे लगता है), तो .decode('utf-8')चाल करना चाहिए, न ही?
ch3ka

ज़रूर, तुम शायद सही हो। मैं सिर्फ यह समझा रहा था कि इस स्थिति में आपको वह विशिष्ट त्रुटि क्यों मिलती है।
एजीएफ़

1
उत्तम! आपका बहुत बहुत धन्यवाद। तो यह पता चला है कि यह था .d timecode ('लैटिन -1') - इसका मतलब है क्योंकि यह Ñ था जो मुझे समस्या दे रहा था। फिर! धन्यवाद!
jelkimantis

आपका समाधान कुछ मामलों के लिए काम करता है, लेकिन अगर मैं इसका उपयोग करता हूं, तो मुझे एक और त्रुटि मिलती है 'एससीआई' कोडेक स्थिति 2 में चरित्र u '\ xf1 को सांकेतिक शब्दों में बदलना नहीं कर सकता है: क्रमबद्ध नहीं रेंज (128)
विकाश मिश्रा

84

बस इस कोड को अपने कोड में जोड़ें:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

5
`एट्रीब्यूट: मॉड्यूल 'एसईएस' में कोई विशेषता नहीं है 'सेटडेफॉल्टेनकोडिंग' पायथन 3 में काम नहीं करता है
स्केर्र्न्स

हुर्रे हुर्रे! इससे मुझे मदद मिली।
शौगो माकिशिमा

1
यह मेरे पायथन 2.7 के लिए काम करता है, ध्यान दें, फिर से लोड (एसआईएस) की आवश्यकता है, अन्यथा, सेटडेफॉल्टेनकोडिंग सुलभ नहीं होगा।
यू शेन

1
यही एक चीज थी जिसने मुझे कई एसओ प्रश्नों से बाहर कर दिया। बहुत बहुत धन्यवाद!
फ्रीडो जूल

नाम 'पुनः लोड' परिभाषित नहीं है
डेविड

28

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

with open(csv_name_here, 'r', encoding="utf-8") as f:
    #some codes

यह फ्लास्क के साथ भी काम करता है :)


1
पहली बार जब मैंने यहां के माध्यम से किसी की मदद की। यह जानकर अच्छा लगा कि मैंने मदद की :)
Skrmnghrd

1
और आपने मेरी भी मदद की :) फ़ाइल पढ़ने के लिए अन्य सभी उत्तर काम नहीं आए। अब मुझे यह पता लगाने की आवश्यकता है कि इसे लिखने के लिए भी कैसे ठीक किया जाए?)
user2194898

क्या आप मुझे अपने कोड का लिंक भेज सकते हैं? मैं मदद करने की कोशिश करूँगा
Skrmnghrd

9

त्रुटि का मुख्य कारण यह है कि अजगर द्वारा निर्धारित डिफ़ॉल्ट एन्कोडिंग ASCII है। इसलिए, यदि स्ट्रिंग डेटा को एनकोड किया जा सकता है encode('utf8')जिसमें 'Hgvcj g 7 387' जैसे स्ट्रिंग के लिए ASCII रेंज जैसे बाहर है, तो अजगर त्रुटि को फेंक देगा क्योंकि स्ट्रिंग अपेक्षित एन्कोडिंग प्रारूप में नहीं है।

यदि आप संस्करण 3.5 की तुलना में पहले अजगर संस्करण का उपयोग कर रहे हैं, तो एक विश्वसनीय निर्धारण अजगर द्वारा ग्रहण की गई डिफ़ॉल्ट एन्कोडिंग को सेट करना होगा utf8:

import sys
reload(sys)
sys.setdefaultencoding('utf8')
name = school_name.encode('utf8')

इस तरह अजगर ASCII रेंज के बाहर गिरने वाले तार के भीतर वर्णों का अनुमान लगाने में सक्षम होगा।

हालाँकि, यदि आप अजगर संस्करण 3.5 या इसके बाद के संस्करण का उपयोग कर रहे हैं, तो पुनः लोड () फ़ंक्शन उपलब्ध नहीं है, इसलिए आपको डिकोड जैसे का उपयोग करके इसे ठीक करना होगा

name = school_name.decode('utf8').encode('utf8')

आपके उत्तर और मेरे बीच क्या अंतर है
khelili miliana

1
और जानकारी। लोग अक्सर कारण संबंधी विवरण को उपयोगी पाते हैं। और आपका कोड btw काम करता है, कोई अपमानजनक उद्देश्य नहीं है।
टेमी फकुनले

1
पुनः लोड पाइथन 3 में उपलब्ध है आपको इसे आयात करना होगा। आयात पुनः लोड से
मेव

@Meow लेकिन Python 3 में sys.setdefaultencoding नहीं है। 3. इसलिए संगतता py2 \ py3 के संदर्भ में कुछ चेक, sys.getdefaultencoding () हो सकता है। उस मामले के बारे में सलाह के एक टुकड़े की सराहना करेंगे। stackoverflow.com/questions/28127513/…
Konst54

2

पायथन 3 उपयोगकर्ताओं के लिए:

'ascii' से एन्कोडिंग को बदलकर 'latin1' काम करता है।

इसके अलावा, आप नीचे दिए गए स्निपेट का उपयोग करके शीर्ष 10000 बाइट्स को पढ़कर एन्कोडिंग को स्वचालित रूप से खोजने का प्रयास कर सकते हैं:

import chardet  
with open("dataset_path", 'rb') as rawdata:  
            result = chardet.detect(rawdata.read(10000))  
print(result)

2

मेरे कंप्यूटर में गलत लोकेल सेट था।

मैंने पहली बार किया

>>> import locale
>>> locale.getpreferredencoding(False)
'ANSI_X3.4-1968'

locale.getpreferredencoding(False)open()जब आप एन्कोडिंग प्रदान नहीं करते हैं, तो यह फ़ंक्शन कहलाता है । आउटपुट होना चाहिए 'UTF-8', लेकिन इस मामले में यह ASCII का कुछ संस्करण है

फिर मैंने बैश कमांड चलाया localeऔर यह आउटपुट मिला

$ locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

इसलिए, मैं डिफ़ॉल्ट उबंटू लोकेल का उपयोग कर रहा था, जिससे यूटीएफ -8 के बजाय एशसीआई के रूप में फाइलें खोलने के लिए पायथन का कारण बनता है। मुझे अपना लोकेल सेट करना थाen_US.UTF-8

sudo apt install locales 
sudo locale-gen en_US en_US.UTF-8    
sudo dpkg-reconfigure locales

यदि आप लोकेल सिस्टम को नहीं बदल सकते हैं, तो आप अपने सभी पायथन कोड को इस तरह से इनवोक कर सकते हैं:

PYTHONIOENCODING="UTF-8" python3 ./path/to/your/script.py

या करते हैं

export PYTHONIOENCODING="UTF-8"

इसे उस शेल में सेट करने के लिए जिसे आप चलाते हैं।


1

प्रमाणपत्र बनाते या नवीनीकृत करते समय यदि आपको यह समस्या आती है, तो कृपया निम्नलिखित विधि का उपयोग करें

grep -r -P '[^\x00-\x7f]' /etc/apache2 /etc/letsencrypt /etc/nginx

उस कमांड को टिप्पणी में एक .conf फ़ाइल में अपमानजनक चरित्र "ending" मिला। इसे हटाने के बाद (आप अपनी इच्छानुसार टिप्पणियों को संपादित कर सकते हैं) और nginx को पुनः लोड करते हुए, सब कुछ फिर से काम किया।

स्रोत: https://github.com/certbot/certbot/issues/5236


0

या जब आप पायथन में पाठ से निपटते हैं यदि यह एक यूनिकोड पाठ है, तो ध्यान दें कि यह यूनिकोड है।

text=u'unicode text'बस के बजाय सेट करें text='unicode text'

यह मेरे मामले में काम आया।


0

यूटीएफ 16 को अक्षांश और लंबे समय के कारण एन्कोडिंग के साथ खोलें।

with open(csv_name_here, 'r', encoding="utf-16") as f:

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