2017-01-10 11 views
6

मैं एक उत्पादन प्रणाली है, जो मैं एक विकास के वातावरण में पुन: पेश करने में विफल में कोई त्रुटि मिलती है:यूनिकोड एन्कोडररर को पुन: पेश करने के लिए कैसे?

with io.open(file_name, 'wt') as fd: 
    fd.write(data) 

अपवाद:

File "/home/.../foo.py", line 18, in foo 
    fd.write(data) 

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 6400: ordinal not in range(128) 

मैं पहले से ही करने की कोशिश की लेकिन चर में अजीब पात्रों में से एक बहुत कुछ data

लेकिन अब तक मैं UnicodeEncodeError को पुन: उत्पन्न करने में सक्षम नहीं था।

UnicodeEncodeError प्राप्त करने के लिए data में क्या होना चाहिए?

अद्यतन

python -c 'import locale; print locale.getpreferredencoding()' 
UTF-8 

Update2

अगर मैं खोल के माध्यम से और वेब अनुरोध के माध्यम से locale.getpreferredencoding() फोन, एन्कोडिंग "UTF-8" है।

मैंने अपने कोड में अपना अपवाद हैंडलिंग अपडेट किया और कुछ दिनों से getpreferredencoding() लॉग किया। अब यह फिर से हुआ (अब तक मैं इसे मजबूर या पुन: उत्पन्न करने में सक्षम नहीं हूं), और एन्कोडिंग "ANSI_X3.4-1968" है!

मैं कोई सुराग नहीं है जहां इस एन्कोडिंग सेट हो जाता है ....

यह एक अलग दिशा में मेरी समस्या डालता है। इस सवाल को बेकार छोड़ना। मेरी समस्या अब है: पसंदीदा एन्कोडिंग कहां बदल जाती है? लेकिन यह इस सवाल का हिस्सा नहीं है।

एक बड़ा, धन्यवाद सभी के लिए जो

+1

तुम्हें पता है, किसी भी अधिक जानकारी हमें आपकी समस्या को पुनः (आप जानते हैं, एक [MCVE]), वहाँ कोई अन्य जवाब हैं देने के लिए देता है कि बिना। मुझे अत्यधिक संदेह है कि * केवल आपके द्वारा दिखाए गए कोड के साथ * 'locale.getpreferredencoding()' वास्तव में यूटीएफ -8 * है जब आप उस त्रुटि को दबाते हैं *। –

+0

आप फ़ाइल के लिए चुने गए एन्कोडिंग को भी देख सकते हैं; 'io.TextIOWrapper' में 'एन्कोडिंग' विशेषता है। यह इस विशिष्ट मामले में ASCII पर सेट किया जाएगा। –

उत्तर

7

आप मंच के लिए डिफ़ॉल्ट एन्कोडिंग पर भरोसा कर रहे हैं; जब वह डिफ़ॉल्ट एन्कोडिंग यूनिकोड वर्णों का समर्थन नहीं कर सकता है, तो आप फ़ाइल में लिख रहे हैं, आपको एक एन्कोडिंग अपवाद मिलता है।

io.open() documentation से:

encoding is the name of the encoding used to decode or encode the file. This should only be used in text mode. The default encoding is platform dependent (whatever locale.getpreferredencoding() returns), but any encoding supported by Python can be used.

अपने विशिष्ट स्थिति के लिए, डिफ़ॉल्ट locale.getpreferredencoding() द्वारा दिया ASCII है, इसलिए ASCII सीमा के बाहर किसी भी यूनिकोड वर्ण इस मुद्दे, यू-0080 का कारण और ऊपर जाएगा।

ध्यान दें कि लोकेल आपके पर्यावरण से लिया गया है; यदि यह ASCII है, तो आमतौर पर इसका मतलब है कि लोकेल POSIX default locale, C पर सेट है।

एन्कोडिंग स्पष्ट रूप से उल्लेख करें:

with io.open(file_name, 'wt', encoding='utf8') as fd: 
    fd.write(data) 

मैं UTF-8 का इस्तेमाल किया एक उदाहरण के रूप; जो भी आप चुनते हैं वह पूरी तरह से आपके उपयोग के मामलों और उस डेटा पर निर्भर करता है जिसे आप लिखने की कोशिश कर रहे हैं।

+0

locale.getpreferredencoding() यूटीएफ -8 देता है। AFAIK प्रत्येक स्ट्रिंग utf8 को एन्कोड किया जा सकता है। यही कारण है कि मैं "डेटा" की सामग्री को समझ नहीं पा रहा हूं। – guettli

+1

@guettli: * उस प्रणाली पर जो अपवाद उठाता है *? चूंकि आपका ट्रेसबैक स्पष्ट रूप से इंगित करता है कि यह 'fd.write' कॉल है जो इस समस्या का कारण बनता है, और केवल एक ही कोडेक जो उपयोग करेगा वह' fd' के लिए एन्कोडिंग सेट है। –

+1

@guettli: सुनिश्चित करें कि जब यह अपवाद होता है तो आप 'repr (डेटा)' और 'locale.getpreferredencoding()' दोनों को कैप्चर करते हैं। ट्रिपल-'एफडी' क्या है और इस बारे में आपकी धारणाओं की जांच करें कि ट्रेसबैक वास्तव में 'fd.write()' पर इंगित कर रहा है। –

0

एक बाइनरी फ़ाइल में अपने write एक try/except में और बचाने के डेटा लपेटें - आप वास्तव में क्या डेटा आप मुद्दों दे रहा है देखने के लिए सक्षम हो जाएगा:

with io.open(file_name, 'wt') as fd: 
    try: 
     fd.write(data) 
    except UnicodeEncodeError: 
     with open('/path/to/save/error.bin', 'wb') as err: 
      err.write(data) 
     raise 
+0

ऐसा नहीं है कि अपवाद पहले से ही आपको बता रहा है कि कोडेक का उपयोग क्यों किया जा रहा है। यह असली मुद्दा है; लेखन क्यों एएससीआईआईआई को एन्कोडिंग ट्रिगर कर रहा है। यह ध्यान रखना दिलचस्प है कि ओपी ने इस प्रश्न से ठीक पहले एन्कोडिंग ट्रिगर्स के बारे में पूछा: [क्यों यूनिकोड एन्कोडर \ * \ * डीकोडिंग \ * \ *?] (// stackoverflow.com/q/41567720) –

1

मैं इस कोशिश की पुन: पेश करने त्रुटि:

with open(filename, 'wt', encoding='ascii') as fd: 
    fd.write('\xa0') 

Traceback (most recent call last):
File "test.py", line 2, in fd.write('\xa0')
UnicodeEncodeError: 'ascii' codec can't encode character '\xa0' in position 0: ordinal not in range(128)

+0

निश्चित रूप से, लेकिन ओपी 'एन्कोडिंग = 'का उपयोग नहीं कर रहा है। तो एन्कोडिंग उनके मामले में कहां से आती है? –

+0

@MartijnPieters ओपी टिप्पणियों में कहता है, 'locale.getpreferredencoding() '' utf-8' देता है तो यहां क्या हो रहा है? – Juggernaut

+1

मैंने ओपी से इसके बारे में अधिक जानकारी प्राप्त करने का प्रयास किया है। वे उस अपवाद * और * 'locale.getprefrerredencoding()' 'UTF-8' होने के कारण नहीं प्राप्त कर सकते हैं, उनके द्वारा पोस्ट किए गए कोड के साथ नहीं। मैंने बकाया रखने से पहले अपना जवाब पोस्ट किया, इसलिए स्पष्ट रूप से ओपी इस पर मेरा विश्वास नहीं करता है। –

संबंधित मुद्दे

 संबंधित मुद्दे