ত্রুটি ইউনিকোডডেকোড ইরর: 'utf-8' কোডেক 0 বায়ু 0xff পজিশনে ডিকোড করতে পারে না: অবৈধ শুরু বাইট


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-encoded স্ট্রিং হিসাবে ধরে নেয়) একটি ইউনিকোড স্ট্রিংতে রূপান্তর করার চেষ্টা করে ( str)। অবশ্যই এই প্রক্রিয়াটি utf-8 বিধি অনুসারে একটি ডিকোডিং। এটি যখন এটি চেষ্টা করে, এটি একটি বাইট অনুক্রমের সাথে মুখোমুখি হয় যা utf-8-encoded স্ট্রিংগুলিতে অনুমোদিত নয় (যথা 0 0 পিএফ 0 পজিশনে)।

যেহেতু আপনি যে কোডটি দেখতে পেলেন সেগুলি আপনি সরবরাহ করেন নি, আমরা কেবলমাত্র বাকীটি অনুমান করতে পারি।

স্ট্যাক ট্রেস থেকে আমরা ধরে নিতে পারি যে ট্রিগার ক্রিয়াটি কোনও ফাইল ( contents = open(path).read()) থেকে পড়া ছিল । আমি এটি এর মতো ফ্যাশনে পুনরায় পুনর্নির্মাণের প্রস্তাব দিচ্ছি:

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

যে bমোডে সুনির্দিষ্টভাবে উল্লেখ করা মধ্যে open()রাজ্যের ফাইলটিতে বাইনারি হিসাবে গণ্য হইবে, তাই contentsএকটি থাকবে bytes। কোনও ডিকোডিংয়ের প্রচেষ্টা এইভাবে ঘটবে না।


": মোড স্ট্রিং 'R' এক সঙ্গে শুরু হওয়া উচিত 'W', 'একটি' বা 'ইউ', না 'বিআর' ValueError" আমি ত্রুটি পেয়ে করছি
Unnikrishnan

3
@ উন্নীকৃষ্ণান ঠিক আছে, তারপরে ব্যবহার করুন rb(আমার মনে হয়েছিল অর্ডারটির কোনও গুরুত্ব নেই, তবে এটি সম্ভবত কমপক্ষে কিছু সিস্টেম / সংস্করণে)। আমি সেই অনুযায়ী আমার উত্তর পরিবর্তন করেছি।
আলফ

57
byte 0xff in position 0এছাড়াও ফাইল UTF-16 এনকোডেড হয়েছে মানে হতে পারে, তাহলে আপনি কি করতে পারেন with open(path, encoding='utf-16') as f:পরিবর্তে
নিকোলাই আর Kristiansen

আসলে যদি কোন 0xffপদে কোন চরিত্র না থাকে 0? এবং এটি UTF-8এনকোড করা আছে।
Iulian Onofrei

খাঁটি '\xFF'চরিত্রটি ইউটিএফ -8 তে এনকোড করা হবে '\xC3\xBF'। UTF-8 দুটি অক্ষর ব্যবহার করে একটি সেট এমএসবি দিয়ে সমস্ত অক্ষরকে এনকোড করে। ( printf "\xff" | iconv -f latin1 -t utf-8 | xxdশেলের আউটপুট দেখুন '\xFF')
Alfe

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
নামমান

2
সেরা উত্তর হওয়া উচিত
স্ট্যাথাম

আমার ব্যবহারের ক্ষেত্রে সর্বোত্তম সমাধান :)
'13

আপনি যখন "কিছু চরিত্র হারাবেন" বলছেন তখন আপনার অর্থ কী ত্রুটিযুক্ত ফাইলটি পড়বে না? বা যে ফাইলের সমস্ত বিষয়বস্তু পড়া হবে না?
এমএসআউটপিকো

@msoutopico যেহেতু এটি ত্রুটিগুলি উপেক্ষা করছে, তাই কিছু এনকোডিংগুলি পড়বে না যা সমস্যা সৃষ্টি করছে। তবে পড়ার সময় এড়িয়ে যাওয়া কোনও বিষয়বস্তু কখনও আসেনি। সুতরাং মূলত ইকোডিং সম্পর্কিত বিষয়গুলি উপেক্ষা করা হয়।
নীতীশ কুমার পাল

23

এর মতোই সমস্যা ছিল, ডিকোড করতে ইউটিএফ -16 ব্যবহার করে শেষ হয়েছে। আমার কোডটি নীচে রয়েছে।

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

এটি ফাইলের সামগ্রীগুলি আমদানি হিসাবে গ্রহণ করবে তবে এটি ইউটিএফ ফর্ম্যাটে কোডটি ফিরিয়ে আনবে। সেখান থেকে এটি ডিকোড করে লাইন দ্বারা পৃথক করা হবে।


10
পাইথন 3 এ আপনি এনকোডিং পরম ব্যবহার করে এটিকে সহজ করতে পারবেনwith open(path, encoding='utf-16') as f
নিকোলাই আর ক্রিশ্চিয়েনসেন

@ নিকোলাইআর ক্রিস্টিয়ানসেন আমি আপনার পদ্ধতিটি ব্যবহার করার চেষ্টা করেছি, কিন্তু হিসাবে একটি ত্রুটি পেয়েছি TypeError: an integer is required (got type str)। কেন? উভয় ফাইল বাইনারি এবং হিসাবে পড়া rb
বোগোটা

1
@ বোগোতা encodingপাঠ্য পড়ার সময় পরম কেবল তখনই বোধগম্য হয়। মোড আর্গুমেন্ট থেকে 'বি' ফেলে দিন এবং আবার চেষ্টা করুন। দস্তাবেজগুলিতে আরও পড়ুন: docs.python.org/3/library/function.html#open
নিকোলাই আর ক্রিশ্চিয়েনসেন


15

একই ত্রুটি ভুগলে আমি এই থ্রেডটি পেরিয়ে এসেছি, কিছু গবেষণা করার পরে আমি নিশ্চিত করতে পারি, আপনি যখন ইউটিএফ -8 দিয়ে কোনও ইউটিএফ -16 ফাইল ডিকোড করার চেষ্টা করেন তখন এটি এমন একটি ত্রুটি হয়।

ইউটিএফ -16 এর সাথে প্রথম চরিত্রটি (ইউটিএফ -16 এ 2 বাইট) হ'ল একটি বাইট অর্ডার মার্ক (বিওএম) , যা ডিকোডিং ইঙ্গিত হিসাবে ব্যবহৃত হয় এবং ডিকোড স্ট্রিংয়ে অক্ষর হিসাবে উপস্থিত হয় না। এর অর্থ প্রথম বাইট হয় এফই বা এফএফ এবং দ্বিতীয়টি, অন্যটি হবে।

আমি আসল উত্তরটি খুঁজে পাওয়ার পরে ভারী সম্পাদিত


এতে ২ ঘন্টা মাথা ব্যথা শেষ! ওপেন ('ফাইলের নাম', 'আর') দিয়ে এফ হিসাবে ফাইলটি খোলার পরে এবং এর বিষয়বস্তু প্রিন্ট করা ইউটিএফ -8 দেখায়, যা ভুল।
নালড্রয়েড


3

আপনি যদি কোনও ম্যাকের উপরে থাকেন তবে আপনি কোনও লুকানো ফাইলের জন্য কিনা, .ডিএসএস স্টোর। ফাইলটি সরানোর পরে আমার প্রোগ্রামটি কাজ করেছিল।


1

পড়ার জন্য ফাইলের পথটি পরীক্ষা করুন। আমার কোডটি ততক্ষণ ত্রুটি দিতে থাকে যতক্ষণ না আমি পথের নামটি কার্যতালিকা ডিরেক্টরিতে পরিবর্তিত করি। ত্রুটিটি ছিল:

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

1

আপনি যদি সিরিয়াল পোর্ট থেকে ডেটা গ্রহণ করছেন তবে নিশ্চিত হয়ে নিন যে আপনি ডান বাউড্রেট (এবং অন্যান্য কনফিগারেশন) ব্যবহার করছেন: ডিকোডিং ( utf-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()

তবে আমার আরও একটি সমস্যা হয়েছিল। কিছু এইচটিএমএল ফাইল (আমার ক্ষেত্রে) utf-8 ছিল না, তাই আমিও একই রকম ত্রুটি পেয়েছি। আমি যখন এইচটিএমএল ফাইলগুলি বাদ দিয়েছি, তখন সবকিছু সুচারুভাবে কাজ করেছিল।

সুতরাং, কোড ঠিক করা ব্যতীত, আপনি যে ফাইলগুলি পড়ছেন সেগুলিও পরীক্ষা করে দেখুন, সম্ভবত সেখানে কোনও অসম্পূর্ণতা থাকতে পারে।


-4

যদি সম্ভব হয় তবে ফাইলটিকে একটি পাঠ্য সম্পাদক থেকে খুলুন এবং এনকোডিংটি ইউটিএফ -8 এ পরিবর্তন করার চেষ্টা করুন। অন্যথায় এটি ওএস পর্যায়ে প্রোগ্রামক্রমে করুন।


-4

আমি একই সমস্যা আছে। আমি টেনসরফ্লো / মডেল / অবজেক্টিভিডেকশন একটি উদাহরণ চালানোর চেষ্টা করি এবং একই বার্তাটি পূরণ করেছি met পাইথন 3 কে পাইথন 2 এ পরিবর্তন করার চেষ্টা করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.