पायथन यूनिकोड त्रुटि त्रुटि


104

मैं अमेज़न एक्सएमएल फ़ाइल को पढ़ रहा हूं और पार्स कर रहा हूं, जबकि एक्सएमएल फाइल एक 'दिखाता है, जब मैं इसे प्रिंट करने की कोशिश करता हूं तो मुझे निम्नलिखित त्रुटि मिलती है:

'ascii' codec can't encode character u'\u2019' in position 16: ordinal not in range(128) 

मैंने अब तक जो भी ऑनलाइन पढ़ा है, उसमें त्रुटि इस तथ्य से आ रही है कि XML फाइल UTF-8 में है, लेकिन अजगर इसे ASCII एनकोडेड कैरेक्टर के रूप में हैंडल करना चाहता है। क्या त्रुटि को दूर करने का एक सरल तरीका है और मेरे प्रोग्राम को XML को प्रिंट करना है जैसे वह पढ़ता है?


मैं सिर्फ एसओ को यह सवाल पोस्ट करने के लिए आ रहा था। वहाँ एक स्ट्रिंग के लिए पवित्रा करने के लिए एक आसान तरीका है unicode()?
निक हेइनर

कृपया संबंधित प्रश्न के लिए इस उत्तर की भी जाँच करें : "पायथन यूनिकोडडॉसफ़्रेम - क्या मैं गलत समझ रहा हूँ?"
tzot 22:11

जवाबों:


193

संभवतः, आपकी समस्या यह है कि आपने इसे ठीक कर दिया है, और अब आप XML की सामग्री को प्रिंट करने का प्रयास कर रहे हैं और आप कुछ विदेशी यूनिकोड वर्णों के कारण नहीं कर सकते। अपनी यूनिकोड स्ट्रिंग को पहले की तरह इस्की करने की कोशिश करें:

unicodeData.encode('ascii', 'ignore')

'अनदेखा' भाग इसे केवल उन वर्णों को छोड़ने के लिए कहेगा। अजगर डॉक्स से:

>>> u = unichr(40960) + u'abcd' + unichr(1972)
>>> u.encode('utf-8')
'\xea\x80\x80abcd\xde\xb4'
>>> u.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeEncodeError: 'ascii' codec can't encode character '\ua000' in position 0: ordinal not in range(128)
>>> u.encode('ascii', 'ignore')
'abcd'
>>> u.encode('ascii', 'replace')
'?abcd?'
>>> u.encode('ascii', 'xmlcharrefreplace')
'&#40960;abcd&#1972;'

आप इस लेख को पढ़ना चाह सकते हैं: http://www.joelonsoftware.com/articles/Unicode.html , जो मुझे एक बुनियादी ट्यूटोरियल के रूप में बहुत उपयोगी लगा, जो चल रहा है। पढ़ने के बाद, आप यह महसूस करना बंद कर देंगे कि आप केवल अनुमान लगा रहे हैं कि क्या उपयोग करना है (या कम से कम जो मेरे साथ हुआ है)।


1
मैं निम्नलिखित स्ट्रिंग को सुरक्षित बनाने की कोशिश कर रहा हूं: 'फू "बार बार" डीएफ' (घुंघराले उद्धरणों पर ध्यान दें), लेकिन उपरोक्त अभी भी मेरे लिए विफल है।
निक हेइनर

@ रोसर्क: विफल कैसे? वही त्रुटि? और आपने किस त्रुटि से निपटने वाले नियम का उपयोग किया?
स्कॉट स्टैफ़ोर्ड

@Rosarch, आपकी समस्या शायद पहले की है। इस कोड को आज़माएं: # - - कोडिंग: लैटिन -1 - - u = u 'फू "बार बार" df' प्रिंट u.encode ('ascii', 'अनदेखा') आपके लिए, यह संभवतः आपके स्ट्रिंग को परिवर्तित कर रहा था INTO साइकोड। पायथन विभाजन के लिए आपके द्वारा निर्दिष्ट एन्कोडिंग जो त्रुटि को फेंक देती है।
स्कॉट स्टैफ़ोर्ड

मैंने आगे बढ़ कर अपना मुद्दा अपने आप में बना लिया: stackoverflow.com/questions/3224427/…
निक हेनर

1
.encode('ascii', 'ignore')ओपी के वातावरण में गैर-
अस्की

16

एक बेहतर समाधान:

if type(value) == str:
    # Ignore errors even if the string is not proper UTF-8 or has
    # broken marker bytes.
    # Python built-in function unicode() can do this.
    value = unicode(value, "utf-8", errors="ignore")
else:
    # Assume the value object has proper __unicode__() method
    value = unicode(value)

यदि आप इसके बारे में अधिक पढ़ना चाहते हैं:

http://docs.plone.org/manage/troubleshooting/unicode.html#id1


3
यह ओपी के मुद्दे के साथ मदद नहीं करता है: "चरित्र u '\ u2019' को एनकोड नहीं कर सकता है"u'\u2019यूनिकोड पहले से ही है।
JFS

6

अपने स्क्रिप्ट के अंदर अपने पर्यावरण के चरित्र एन्कोडिंग को हार्डकोड न करें; इसके बजाय सीधे यूनिकोड टेक्स्ट प्रिंट करें:

assert isinstance(text, unicode) # or str on Python 3
print(text)

यदि आपका आउटपुट किसी फ़ाइल (या पाइप) पर पुनर्निर्देशित किया गया है; PYTHONIOENCODINGवर्ण एन्कोडिंग को निर्दिष्ट करने के लिए आप envvar का उपयोग कर सकते हैं :

$ PYTHONIOENCODING=utf-8 python your_script.py >output.utf8

अन्यथा, python your_script.pyके रूप में काम करना चाहिए है - अपने स्थान सेटिंग्स पाठ एन्कोड करने के लिए उपयोग किया जाता है (इसे POSIX चेक पर: LC_ALL, LC_CTYPE, LANGenvvars - सेट LANGएक utf-8 के स्थान के लिए यदि आवश्यक हो तो)।

विंडोज पर यूनिकोड को प्रिंट करने के लिए, इस उत्तर को देखें जो दिखाता है कि यूनिकोड को विंडोज कंसोल, एक फाइल, या आईडीएलई के उपयोग से कैसे प्रिंट किया जाए


1

उत्कृष्ट पोस्ट: http://www.carlosble.com/2010/12/understanding-python-and-unicode/

# -*- coding: utf-8 -*-

def __if_number_get_string(number):
    converted_str = number
    if isinstance(number, int) or \
            isinstance(number, float):
        converted_str = str(number)
    return converted_str


def get_unicode(strOrUnicode, encoding='utf-8'):
    strOrUnicode = __if_number_get_string(strOrUnicode)
    if isinstance(strOrUnicode, unicode):
        return strOrUnicode
    return unicode(strOrUnicode, encoding, errors='ignore')


def get_string(strOrUnicode, encoding='utf-8'):
    strOrUnicode = __if_number_get_string(strOrUnicode)
    if isinstance(strOrUnicode, unicode):
        return strOrUnicode.encode(encoding)
    return strOrUnicode

0

आप प्रपत्र का कुछ उपयोग कर सकते हैं

s.decode('utf-8')

जो एक UTF-8 एन्कोडेड पायथन को पायथन यूनिकोड स्ट्रिंग में बदल देगा। लेकिन उपयोग करने की सटीक प्रक्रिया इस बात पर निर्भर करती है कि आप XML फ़ाइल को कैसे लोड और पार्स करते हैं, जैसे यदि आप कभी XML स्ट्रिंग को सीधे एक्सेस नहीं करते हैं, तो आपको codecsमॉड्यूल से डिकोडर ऑब्जेक्ट का उपयोग करना पड़ सकता है ।


यह पहले से ही UTF-8 में इनकोडेड है। त्रुटि विशेष रूप से है: myStrings = deque ([u'Dorf और Svoboda \ u2019s text str पर बनाता है ... और कंप्यूटर इंजीनियरिंग \ u2019s subdisciplines। '') स्ट्रिंग UTF-8 में है। आप देख सकते हैं, लेकिन यह
एलेक्स बी

ओह, ठीक है, मैंने सोचा कि आपको एक अलग समस्या थी।
डेविड जेड

7
@ एलेक्स बी: नहीं, स्ट्रिंग यूनिकोड है, यूटीएफ -8 नहीं। Utf-8 उपयोग के रूप में इसे एनकोड करने के लिए'...'.encode('utf-8')
sth

0

मैंने उपद्रव गैर-असिसी उद्धरणों को ठीक करने और कुछ उपयोग करने के लिए रूपांतरण को मजबूर करने के लिए निम्नलिखित लिखा था।

unicodeToAsciiMap = {u'\u2019':"'", u'\u2018':"`", }

def unicodeToAscii(inStr):
    try:
        return str(inStr)
    except:
        pass
    outStr = ""
    for i in inStr:
        try:
            outStr = outStr + str(i)
        except:
            if unicodeToAsciiMap.has_key(i):
                outStr = outStr + unicodeToAsciiMap[i]
            else:
                try:
                    print "unicodeToAscii: add to map:", i, repr(i), "(encoded as _)"
                except:
                    print "unicodeToAscii: unknown code (encoded as _)", repr(i)
                outStr = outStr + "_"
    return outStr

0

यदि आपको स्क्रीन पर स्ट्रिंग के अनुमानित प्रतिनिधित्व को प्रिंट करने की आवश्यकता है, बजाय उन गैर-अक्षर वाले पात्रों को अनदेखा करने के लिए, कृपया unidecodeयहां पैकेज देखें:

https://pypi.python.org/pypi/Unidecode

स्पष्टीकरण यहाँ पाया गया है:

https://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/

यह u.encode('ascii', 'ignore')किसी दिए गए स्ट्रिंग के लिए उपयोग करने से बेहतर हैu , और आपको अनावश्यक सिरदर्द से बचा सकता है यदि चरित्र परिशुद्धता वह नहीं है जो आप बाद में हैं, लेकिन फिर भी मानव पठनीयता चाहते हैं।

Wirawan


-1

अपने पायथन स्क्रिप्ट के शीर्ष पर निम्न पंक्ति जोड़ने का प्रयास करें।

# _*_ coding:utf-8 _*_

-1

पायथन 3.5, 2018

यदि आप नहीं जानते कि एन्कोडिंग लेकिन यूनिकोड पार्सर में क्या समस्याएँ हैं, तो आप फ़ाइल Notepad++को शीर्ष बार में चुन सकते हैं Encoding->Convert to ANSI। फिर आप अपने अजगर को इस तरह लिख सकते हैं

with open('filepath', 'r', encoding='ANSI') as file:
    for word in file.read().split():
        print(word)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.