त्रुटि UnicodeDecodeError: 'utf-8' कोडक 0xff को बाइट नहीं कर सकता है 0xff 0 में: स्टार्ट बाइट


162

https://github.com/affinelayer/pix2pix-tensorflow/tree/master/tools

उपरोक्त साइट पर "process.py" संकलन करते समय एक त्रुटि हुई।

 python tools/process.py --input_dir data --            operation resize --outp
ut_dir data2/resize
data/0.jpg -> data2/resize/0.png

ट्रेसबैक (सबसे हालिया कॉल अंतिम):

File "tools/process.py", line 235, in <module>
  main()
File "tools/process.py", line 167, in main
  src = load(src_path)
File "tools/process.py", line 113, in load
  contents = open(path).read()
      File"/home/user/anaconda3/envs/tensorflow_2/lib/python3.5/codecs.py", line 321, in decode
  (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode     byte 0xff in position 0: invalid start byte

त्रुटि का कारण क्या है? पायथन का संस्करण 3.5.2 है।

जवाबों:


194

पायथन एक बाइट-ऐरे ( bytesजो इसे एक utf-8-एन्कोडेड स्ट्रिंग होना चाहिए) को एक यूनिकोड स्ट्रिंग ( str) में बदलने की कोशिश करता है । पाठ्यक्रम की यह प्रक्रिया utf-8 नियमों के अनुसार एक डिकोडिंग है। जब यह कोशिश करता है, तो यह एक बाइट अनुक्रम का सामना करता है जिसे utf-8-एन्कोडेड स्ट्रिंग्स में अनुमति नहीं है (अर्थात् यह 0xff स्थिति 0 पर)।

चूँकि आपने ऐसा कोई कोड प्रदान नहीं किया जिसे हम देख सकते हैं, हम केवल बाकी पर अनुमान लगा सकते हैं।

स्टैक ट्रेस से हम मान सकते हैं कि ट्रिगरिंग एक्शन फाइल ( contents = open(path).read()) से रीडिंग थी । मैं इस तरह से इसे फिर से बनाने का प्रस्ताव करता हूं:

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

यही कारण है कि bमें मोड विनिर्देशक में open()कहा गया है कि इस फ़ाइल में बाइनरी रूप में माना जाएगा, तो contentsएक ही रहेगा bytes। कोई डिकोडिंग का प्रयास इस तरह से नहीं होगा।


मुझे त्रुटि मिल रही है "ValueError: मोड स्ट्रिंग को 'r', 'w', 'a' या 'U' से शुरू होना चाहिए, न कि 'br'
Unnikrishnan

3
@ यूनिकृष्णन ओके, तब उपयोग rb(मुझे लगा कि आदेश का कोई महत्व नहीं था, लेकिन ऐसा लगता है, कम से कम कुछ प्रणालियों / संस्करणों में)। मैंने उसी हिसाब से अपना जवाब बदल दिया।
अल्फ

57
byte 0xff in position 0इसका मतलब यह भी हो सकता है कि फ़ाइल को UTF-16 में एनकोड किया गया है, तो आप with open(path, encoding='utf-16') as f:इसके बजाय कर सकते हैं
निकोलाई आर क्रिस्टियनसेन

अगर वास्तव में कोई 0xffचरित्र नहीं है तो क्या होगा 0? और यह UTF-8एनकोडेड है।
इयूलियन ओनोफ्रेई

एक शुद्ध '\xFF'चरित्र को UTF-8 में एन्कोड किया जाएगा '\xC3\xBF'। UTF-8 ने दो वर्णों का उपयोग करते हुए एक सेट MSB के साथ सभी वर्णों को एन्कोड किया। ( printf "\xff" | iconv -f latin1 -t utf-8 | xxdशेल में आउटपुट देखें ।) '\xFF'UTF-8 एनकोडेड स्ट्रिंग की शुरुआत में एक शब्दशः एक एन्कोडिंग त्रुटि है (इसे UTF-8 के संदर्भ में एक वाक्यविन्यास त्रुटि कहा जा सकता है)।
अल्फ

83

इस समाधान का उपयोग करें यह वर्णों को अलग करेगा (अनदेखा) और उनके बिना स्ट्रिंग लौटाएगा। केवल इस का उपयोग करें यदि आपकी आवश्यकता उन्हें पट्टी करने के लिए है उन्हें परिवर्तित न करें।

with open(path, encoding="utf8", errors='ignore') as f:

का उपयोग कर errors='ignore' आप बस कुछ वर्ण खो देंगे। लेकिन अगर आपके बारे में उन्हें कोई परवाह नहीं है, क्योंकि वे मेरे सॉकेट सर्वर से जुड़ने वाले क्लाइंट के खराब फॉर्मेटिंग और प्रोग्रामिंग से उत्पन्न होने वाले अतिरिक्त अक्षर लगते हैं। फिर इसका एक आसान सीधा उपाय है। संदर्भ


6
डीकोड के लिए काम करता है () साथ ही: contents = contents.decode('utf-8', 'ignore')स्रोत: docs.python.org/3/howto/unicode.html#the-string-type
naaman

2
सबसे अच्छा उत्तर होना चाहिए
स्टेटम

मेरे उपयोग के मामले में सबसे अच्छा समाधान :)
maestromusica

जब आप कहते हैं "कुछ अक्षर खो देते हैं" तो क्या आपका मतलब है कि त्रुटियों वाली फ़ाइल नहीं पढ़ी जाएगी? या उस फ़ाइल की सभी सामग्री नहीं पढ़ी जाएगी?
msoutopico 15

@msoutopico चूंकि यह त्रुटियों को अनदेखा कर रहा है, इसलिए कुछ एन्कोडिंग को नहीं पढ़ा जाएगा जो समस्या पैदा कर रहे हैं। लेकिन कभी भी कोई ऐसी सामग्री सामने नहीं आई है जिसे पढ़ते समय छोड़ दिया गया हो। इसलिए मूल रूप से इकोडिंग मुद्दों की अनदेखी की जाती है।
नितीश कुमार पाल

23

इसके समान एक मुद्दा था, डीकोड करने के लिए UTF-16 का उपयोग कर समाप्त हुआ। मेरा कोड नीचे है।

with open(path_to_file,'rb') as f:
    contents = f.read()
contents = contents.rstrip("\n").decode("utf-16")
contents = contents.split("\r\n")

यह फ़ाइल सामग्री को आयात के रूप में ले जाएगा, लेकिन यह UTF प्रारूप में कोड लौटा देगा। वहाँ से इसे डीकोड करके लाइनों द्वारा अलग किया जाएगा।


10
पायथन 3 में आप एन्कोडिंग परम का उपयोग करके इसे सरल बना सकते हैंwith open(path, encoding='utf-16') as f
निकोलाई आर क्रिस्टियनसेन

@NikolaiRKristiansen मैंने आपके तरीके का उपयोग करने की कोशिश की, लेकिन इसे एक त्रुटि मिली TypeError: an integer is required (got type str)। क्यों? दोनों फाइलें बाइनरी हैं और के रूप में पढ़ी जाती हैं rb
बोगोटा

1
@ बोगोटा encodingपाठ पढ़ते समय केवल समझ में आता है। मोड तर्क से 'b' ड्रॉप करें और पुनः प्रयास करें। डॉक्स में और पढ़ें: docs.python.org/3/library/functions.html#open
निकोलाई आर क्रिस्टियनसेन

19

समस्या को हल करने के लिए एन्कोडिंग प्रारूप ISO-8859-1 का उपयोग करें ।


1
अंत में 10+ अन्य एन्कोडिंग की कोशिश के बाद इस पर उतरा!
Rexcirus

15

मैं एक ही त्रुटि से पीड़ित होने पर इस थ्रेड में आया हूं, कुछ शोध करने के बाद मैं पुष्टि कर सकता हूं, यह एक त्रुटि है जब आप UTF-8 के साथ UTF-16 फ़ाइल को डिकोड करने का प्रयास करते हैं।

UTF-16 के साथ पहला अक्षर (UTF-16 में 2 बाइट्स) एक बाइट ऑर्डर मार्क (BOM) है , जिसका उपयोग डिकोडिंग संकेत के रूप में किया जाता है और डिकोड्ड स्ट्रिंग में एक चरित्र के रूप में प्रकट नहीं होता है। इसका मतलब यह है कि पहला बाइट FE या FF होगा और दूसरा, दूसरा।

असली उत्तर का पता चलने के बाद मैंने उसे संपादित किया


इससे 2 घंटे का सिरदर्द खत्म हो गया! फ़ाइल को खुले ('फ़ाइलनाम', 'आर') के रूप में f के साथ खोलना: और फिर इसकी सामग्री को प्रिंट करना UTF-8 को दिखाता है, जो गलत है।
nulldroid


3

यदि आप किसी छुपी हुई फ़ाइल, .DS_Store के लिए मैक चेक पर हैं। फाइल निकालने के बाद मेरे कार्यक्रम ने काम किया।


1

पढ़ने के लिए फ़ाइल का पथ जांचें। जब तक मैंने कार्य निर्देशिका प्रस्तुत करने के लिए पथ का नाम नहीं बदला तब तक मेरा कोड मुझे त्रुटियां देता रहा। त्रुटि थी:

newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

1

यदि आप किसी सीरियल पोर्ट से डेटा प्राप्त कर रहे हैं, तो सुनिश्चित करें कि आप सही बॉड्रेट (और अन्य कॉन्फिग) का उपयोग कर रहे हैं: डिकोडिंग ( यूटीएफ -8 ) का उपयोग कर लेकिन गलत कॉन्फिग से वही त्रुटि उत्पन्न होगी

यूनिकोडडॉफॉर्सेट: 'utf-8' कोडक 0xff को बाइट नहीं कर सकता है 0 स्थिति में: अमान्य प्रारंभ बाइट

लिनक्स उपयोग पर अपने सीरियल पोर्ट के विन्यास की जांच करने के लिए: stty -F /dev/ttyUSBX -a


1

इसका सीधा सा मतलब है कि किसी ने फ़ाइल को पढ़ने के लिए गलत एन्कोडिंग को चुना।

मैक पर, file -I file.txtसही एन्कोडिंग खोजने के लिए उपयोग करें। लिनक्स पर, का उपयोग करें file -i file.txt


0

लिनक्स से उत्पन्न फ़ाइल को संसाधित करते समय मेरे पास एक ही मुद्दा है। यह पता चला है कि यह प्रश्न चिह्न वाली फाइलों से संबंधित था।


-1

मुझे भी ऐसी ही समस्या का समाधान करना पड़ा था।

इसके द्वारा हल किया गया:

import io

with io.open(filename, 'r', encoding='utf-8') as fn:
  lines = fn.readlines()

हालाँकि, मुझे एक और समस्या थी। कुछ html फाइलें (मेरे मामले में) utf-8 नहीं थीं, इसलिए मुझे एक समान त्रुटि मिली। जब मैंने उन html फ़ाइलों को बाहर रखा, तो सब कुछ सुचारू रूप से काम किया।

इसलिए, कोड को ठीक करने के अलावा, उन फ़ाइलों की भी जांच करें जिन्हें आप पढ़ रहे हैं, हो सकता है कि वास्तव में वहां असंगति हो।


-4

यदि संभव हो, तो फ़ाइल को टेक्स्ट एडिटर में खोलें और एन्कोडिंग को UTF-8 में बदलने का प्रयास करें। अन्यथा यह ओएस स्तर पर प्रोग्राम करते हैं।


-4

मुझे एक ऐसी ही समस्या है। मैं टेंसरफ़्लो / मॉडल / उद्देश्य_डेट में एक उदाहरण चलाने की कोशिश करता हूं और उसी संदेश को पूरा करता हूं। Python3 को Python2 में बदलने का प्रयास करें

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