यूनिकोडडॉफॉर्सेट: 'चार्मैप' कोडेक बाइट में एक्स को डिकोड नहीं कर सकता है Y: कैरेक्टर मैप्स को <अनफेयर>


549

मैं एक पायथन 3 प्रोग्राम प्राप्त करने की कोशिश कर रहा हूं, जिसमें सूचनाओं से भरी एक पाठ फ़ाइल के साथ कुछ हेरफेर करने के लिए। हालाँकि, फ़ाइल को पढ़ने की कोशिश करते समय मुझे निम्नलिखित त्रुटि मिलती है:

 Traceback (most recent call last):  
     File "SCRIPT LOCATION", line NUMBER, in <module>  
     `text = file.read()`  
     File "C:\Python31\lib\encodings\cp1252.py", line 23, in decode  
     `return codecs.charmap_decode(input,self.errors,decoding_table)[0]`  
     UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 2907500: character maps to `<undefined>`  

2
उसी त्रुटि के लिए इन समाधानों ने मेरी मदद की, चार्मैप त्रुटि का समाधान
शुभम शर्मा

2
पायथन 3 में प्रोसेसिंग टेक्स्ट फाइलें देखें यह समझने के लिए कि आपको यह त्रुटि क्यों मिली।
एंड्रियास हेफरबर्ग

जवाबों:


959

प्रश्न में फ़ाइल CP1252एन्कोडिंग का उपयोग नहीं कर रही है । यह एक और एन्कोडिंग का उपयोग कर रहा है। आपको खुद को कौन सा पता लगाना है। आम हैं Latin-1और UTF-8। के बाद से 0x90 वास्तव में मतलब कुछ भी नहीं है Latin-1, UTF-8(जहां 0x90 एक निरंतरता बाइट है) अधिक होने की संभावना है।

जब आप फ़ाइल खोलते हैं तो आप एन्कोडिंग निर्दिष्ट करते हैं:

file = open(filename, encoding="utf8")

19
कूल, मुझे कुछ पायथन 2.7 कोड के साथ वह समस्या थी जिसे मैंने पायथन 3.4 में चलाने की कोशिश की थी। लैटिन -1 ने मेरे लिए काम किया!
1and1ng0

2
यदि आप पायथन 2.7 का उपयोग कर रहे हैं, और एक ही त्रुटि हो रही है, तो ioमॉड्यूल का प्रयास करें :io.open(filename,encoding="utf8")
क्रिस्टोफरवेलवेल

9
@ 1vand1ng0: बेशक लैटिन -1 काम करता है; यह फ़ाइल की वास्तविक एन्कोडिंग की परवाह किए बिना किसी भी फ़ाइल के लिए काम करेगा। ऐसा इसलिए है क्योंकि किसी फ़ाइल में सभी 256 संभावित बाइट मानों में मैप करने के लिए एक लैटिन -1 कोडपॉइंट होता है, लेकिन इसका मतलब यह नहीं है कि आपको सुपाठ्य परिणाम मिलेंगे! यदि आप एन्कोडिंग को नहीं जानते हैं, तो फाइल को बाइनरी मोड में खोलना भी लैटिन -1 मानने से बेहतर हो सकता है।
मार्टिन पीटर्स

1
यह डिफ़ॉल्ट रूप से यूनिकोड है, लेकिन यूनिकोड एनकोडिंग नहीं है। regebro.wordpress.com/2011/03/23/…
Lennart Regebro

1
filename = "C:\Report.txt" with open(filename,encoding ="utf8") as my_file: text = my_file.read() print(text)इसके उपयोग के बाद भी मुझे वही त्रुटि मिल रही है। मैंने अन्य एन्कोडिंग के साथ भी कोशिश की है लेकिन सभी व्यर्थ हैं। इस कोड में मैं भी उपयोग कर रहा हूँ from geotext import GeoText। कृपया कोई उपाय सुझाएं।
सालह

47

केवल मामले में जोड़ने के लिए file = open(filename, encoding="utf8")काम नहीं करता हैfile = open(filename, errors='ignore')


बहुत धन्यवाद - मैं इसे एक कोशिश दूंगा। फ़ाइलों के कुछ हिस्सों में कुछ अमान्य वर्ण हैं जिनकी मुझे परवाह नहीं है।
स्टीफन न्यूट

6
चेतावनी: इसके परिणामस्वरूप डेटा हानि होगी जब अज्ञात वर्णों का सामना किया जाएगा (जो आपकी स्थिति के आधार पर ठीक हो सकता है)।
हंस गोल्डमैन

34

@ LennartRegebro के उत्तर के विस्तार के रूप में :

यदि आप यह नहीं बता सकते हैं कि आपकी फ़ाइल का उपयोग करने वाले एन्कोडिंग और ऊपर दिए गए समाधान काम नहीं करते हैं (यह नहीं है utf8) और आपने पाया कि आप केवल अनुमान लगा रहे हैं - ऐसे ऑनलाइन टूल हैं जिनका उपयोग करके आप पहचान सकते हैं कि एन्कोडिंग क्या है। वे सही नहीं हैं, लेकिन आमतौर पर ठीक काम करते हैं। आपके द्वारा एन्कोडिंग का पता लगाने के बाद आपको ऊपर दिए गए समाधान का उपयोग करने में सक्षम होना चाहिए।

संपादित करें: (टिप्पणी से नकल)

एक बहुत लोकप्रिय टेक्स्ट एडिटर Sublime Textमें एन्कोडिंग प्रदर्शित करने के लिए एक कमांड है यदि इसे सेट किया गया है ...

  1. पर जाएं View-> Show Console(या Ctrl+ `)

यहाँ छवि विवरण दर्ज करें

  1. नीचे फ़ील्ड में टाइप करें view.encoding()और सर्वश्रेष्ठ के लिए आशा करें (मैं कुछ भी प्राप्त करने में असमर्थ था Undefinedलेकिन शायद आपके पास बेहतर भाग्य होगा ...)

यहाँ छवि विवरण दर्ज करें


2
कुछ पाठ संपादक यह जानकारी भी प्रदान करेंगे। मुझे पता है कि vim साथ आप के माध्यम से प्राप्त कर सकते हैं :set fileencoding( इस लिंक से )
PaxRomana99

3
उदात्त पाठ, भी - सांत्वना और प्रकार खोलें view.encoding()
जिम्मीज्यू जू

वैकल्पिक रूप से, आप अपनी फ़ाइल को नोटपैड के साथ खोल सकते हैं। 'इस रूप में सहेजें' और आपको इस्तेमाल की जाने वाली एन्कोडिंग के साथ एक ड्रॉप-डाउन दिखाई देगा
don_Gunner94

9

आप इस तरह के एक वेबसाइट पर फ़ाइल अपलोड करने के रूप में फ़ाइल को डिकोड करने की आवश्यकता नहीं है वैकल्पिक रूप से अगर, open(filename, 'rb')। आर = रीडिंग, बी = बाइनरी


धन्यवाद है कि मेरी समस्या के लिए मामला था
शाहीन जी

6

TLDR? प्रयत्न:file = open(filename, encoding='cp437)

क्यों? जब एक का उपयोग करें:

file = open(filename)
text = file.read()

पायथन मान लेता है कि फ़ाइल वर्तमान परिवेश के समान कोडपेज (उद्घाटन पोस्ट के मामले में cp1252) का उपयोग करती है और इसे अपने स्वयं के डिफ़ॉल्ट UTF-8 को डिकोड करने का प्रयास करती है। यदि फ़ाइल में इस कोडपेज (जैसे 0x90) में परिभाषित नहीं किए गए मानों के वर्ण हैं तो हमें यूनिकोडबाउंडइयर मिलता है। कभी-कभी हमें फ़ाइल की एन्कोडिंग का पता नहीं होता है, कभी-कभी फ़ाइल की एन्कोडिंग को पायथन (जैसे cp790) द्वारा अनहेल्ड किया जा सकता है, कभी-कभी फ़ाइल में मिश्रित एनकोडिंग हो सकती है।

यदि इस तरह के चरित्रों को अनधिकृत किया जाता है, तो कोई उन्हें प्रश्नवाचक चिन्ह से बदलने का निर्णय ले सकता है:

file = open(filename, errors='replace')

उपयोग करने के लिए एक और समाधान है:

file = open(filename, errors='ignore')

पात्रों को तो बरकरार रखा गया है, लेकिन अन्य त्रुटियों को भी मुखौटा बनाया जाएगा।

काफी अच्छा समाधान एन्कोडिंग को निर्दिष्ट करना है, फिर भी कोई एन्कोडिंग नहीं है (जैसे cp1252), लेकिन वह जो सभी वर्णों को परिभाषित करता है (जैसे cp437):

file = open(filename, encoding='cp437')

कोडपेज 437 मूल डॉस एन्कोडिंग है। सभी कोड परिभाषित हैं, इसलिए फ़ाइल को पढ़ते समय कोई त्रुटि नहीं होती है, कोई त्रुटि नहीं होती है, वर्ण संरक्षित होते हैं (बिल्कुल बाएं नहीं, लेकिन फिर भी अलग-अलग)।


1
वाह, थॅक्स यू। यह मेरे लिए एकमात्र डिकोडिंग कार्य है।
कोवल्स्की

1

विंडोज में एनाकोंडा में काम करने वालों के लिए, मुझे भी यही समस्या थी। नोटपैड ++ मुझे इसे हल करने में मदद करता है।

फ़ाइल को नोटपैड ++ में खोलें। नीचे दाईं ओर यह आपको वर्तमान फ़ाइल एन्कोडिंग बताएगा। शीर्ष मेनू में, "देखें" के बगल में "एन्कोडिंग" ढूंढें। "एन्कोडिंग" में "कैरेक्टर सेट्स" पर जाएं और वहाँ रोगी को उस एनकाउंटर के लिए देखें जिसकी आपको आवश्यकता है। मेरे मामले में "पश्चिमी यूरोपीय" के तहत एन्कोडिंग "विंडोज -1252" मिला।


1

अपना समय बर्बाद करना बंद करें, बस निम्नलिखित encoding="cp437"और errors='ignore'अपने कोड को पढ़ने और लिखने दोनों में जोड़ें :

open('filename.csv', encoding="cp437", errors='ignore')
open(file_name, 'w', newline='', encoding="cp437", errors='ignore')

गॉडस्पीडः


जरूर मालिक। ठीक है। कोई समय बर्बाद नहीं हुआ। धन्यवाद। क्या आप एक कप कॉफी या एक बढ़िया वाइन चाहेंगे?
प्रमेश बजराचार्य

0

मेरे लिए मेरे कोड को हल करने में मदद करने के लिए उसी तरह एन्कोडिंग मैसकल चरित्र को बदलना। `फोटो = खुला ('pic3.png', एन्कोडिंग = लैटिन 1), मजबूत पाठ यहाँ छवि विवरण दर्ज करें

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