ইউনিকোড ডিকোড এরিয়ার: 'utf8' কোডেক 0xa5 পজিশনে 0 বর্ধিত করতে পারে না: অবৈধ শুরু বাইট


188

আমি Python-2.6 CGIস্ক্রিপ্ট ব্যবহার করছি তবে সার্ভার লগ করার সময় এই ত্রুটিটি পেয়েছি json.dumps(),

Traceback (most recent call last):
  File "/etc/mongodb/server/cgi-bin/getstats.py", line 135, in <module>
    print json.dumps(​​__getdata())
  File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa5 in position 0: invalid start byte

এখানে,

​__get​data()ফাংশন আয় dictionary {}

এই প্রশ্ন পোস্ট করার আগে আমি এই প্রশ্ন ওএস এর উল্লেখ করেছি ।


আপডেট

নিম্নলিখিত লাইনটি JSON এনকোডারকে আঘাত করছে,

now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps({'current_time': now}) // this is the culprit

আমি এটির জন্য একটি অস্থায়ী সমাধান পেয়েছি

print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })

তবে আমি নিশ্চিত না যে এটি করা সঠিক উপায়।


1
দেখে মনে হচ্ছে আপনার অভিধানে কিছু স্ট্রিং ডেটা রয়েছে যা এনকোড / ডিকোড করা যাবে না। কি আছে dict?
মিগিলসন

@ মিগিলসন ইয়াপ মাস্টার আমি বিষয়টি বুঝতে পেরেছি তবে কীভাবে এটি মোকাবেলা করতে হবে না .. dictআছেlist, dict, python timestamp value
দীপক ইনগোলে

1
@ পাইলট - সত্যই নয়। আসল সমস্যাটি কোথাও কবর দেওয়া হয়েছে __getdata। আপনি কেন একটি ডিকোডেবল চরিত্র পাচ্ছেন তা আমি জানি না । এটিকে কার্যকর করার জন্য আপনি ডিকের উপর প্যাচগুলি নিয়ে আসতে চেষ্টা করতে পারেন তবে সেগুলি পরে বেশিরভাগ ক্ষেত্রে আরও সমস্যা জিজ্ঞাসা করছে। আমি অ্যাস্কেই অক্ষরটি কোথায় আছে তা দেখার জন্য ডিকটি মুদ্রণের চেষ্টা করব। তারপরে কীভাবে সেই ক্ষেত্রটি গণনা / সেট এবং সেখান থেকে পিছিয়ে কাজ করে তা নির্ধারণ করুন।
মিগিলসন


1
.Csv ফাইলটি পড়ার চেষ্টা করার সময় আমার একই ত্রুটি হয়েছিল যা এতে কিছু অ-অসি অক্ষর ছিল। এই অক্ষরগুলি সরানো (নীচে প্রস্তাবিত হিসাবে) সমস্যার সমাধান হয়েছে।
দিমিত্রি আর স্টারসন

উত্তর:


87

ত্রুটিটি কারণ অভিধানে কিছু অ-এস্কি অক্ষর রয়েছে এবং এটি এনকোড / ডিকোড করা যায় না। এই ত্রুটিটি এড়ানোর একটি সহজ উপায় হ'ল encode()নিম্নরূপে ফাংশন সহ এই স্ট্রিংগুলি এনকোড করা (যদি aঅ-এসকিআই অক্ষরের স্ট্রিংটি থাকে):

a.encode('utf-8').strip()

2
যেহেতু ইউটিএফ -8 ওল্ডস্কুল 7-বিট ASCII এর সাথে ব্যাক-সামঞ্জস্যপূর্ণ আপনার কেবল সমস্ত কিছু এনকোড করা উচিত। 7-বিট ASCII সীমার অক্ষরের জন্য এই এনকোডিংটি একটি পরিচয় ম্যাপিং হবে।
টাদিউস এ। কাদুউবস্কি

29
এটি বাস্তব পরিষ্কার বলে মনে হচ্ছে না। কোনও সিএসভি ফাইল আমদানির সময় আপনি এই কোডটি কীভাবে ব্যবহার করবেন?
ডেভ

স্ক্যালকিমি কোয়েরি সম্পাদন করার সময় একই সমস্যাটি আমার কাছে উপস্থিত হয়, আমি কীভাবে ক্যোয়ারীটি এনকোড করব (কোনও এনকোড নেই, যেহেতু এটি স্ট্রিং নয়)?
c8999c 3f964f64

129

read_csv()কমান্ডটিতে একটি ভিন্ন কোডেক প্যাকেজ সংজ্ঞায়িত করে আমি এটিকে পরিবর্তন করেছি :

encoding = 'unicode_escape'

উদাহরণ:

import pandas as pd
data = pd.read_csv(filename, encoding= 'unicode_escape')

1
কেবলমাত্র যদি আপনি ব্যবহার করেনpandas
ভ্যালারি

1
দুঃখিত, এটি কাজ করে না, আমার আবার একই ত্রুটি ছিল। তবে যখন আমি ('filename.csv', ইঞ্জিন = 'পাইথন') ব্যবহার করি। এটি কাজ করে।
বাসভরাজ_২৮

117

নীচের কোড স্নিপেট চেষ্টা করুন:

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

7
আমার rপরিবর্তে ছিল rb। অনুস্মারক যোগ করার জন্য ধন্যবাদ b!
পল

1
ডিফল্টরূপে openফাংশনটিতে 'রি' কেবল পঠন মোড হিসাবে রয়েছে। rbবাইনারি মোড পড়ার জন্য দাঁড়িয়েছে।
শিভা

39

আপনার স্ট্রিং এ একটি asciiঅক্ষর এনকোড আছে।

utf-8আপনার কোডটিতে অন্য এনকোডিংগুলি ব্যবহার করার প্রয়োজন হলে ডিকোড করতে সক্ষম না হওয়া ঘটতে পারে। উদাহরণ স্বরূপ:

>>> 'my weird character \x96'.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 19: invalid start byte

এই ক্ষেত্রে, এনকোডিংটি windows-1252তাই আপনাকে করতে হবে:

>>> 'my weird character \x96'.decode('windows-1252')
u'my weird character \u2013'

আপনার কাছে এখন Unicode, আপনি নিরাপদে প্রবেশ করতে পারবেন utf-8


1
আমি একটি সহজ পৃষ্ঠা তৈরি করেছি যা কিছু অপ্রত্যাশিত "রহস্য বাইটস" এর এনকোডিং স্থাপনে সহায়তা করতে পারে; tripleee.github.io/8bit
ট্রিপলি

34

পড়ার সময় csv, আমি একটি এনকোডিং পদ্ধতি যুক্ত করেছি:

import pandas as pd
dataset = pd.read_csv('sample_data.csv', header= 0,
                        encoding= 'unicode_escape')

16

আপনার কোডের শীর্ষে ডিফল্ট এনকোডার সেট করুন

import sys
reload(sys)
sys.setdefaultencoding("ISO-8859-1")

আমি মনে করি পাই পাইথন 3 এর সিএস মডিউলে সেটফেল্টনকোডিং নেই!
আনোয়ার হোসেন

14

2018-05 পর্যন্ত এটি সরাসরি হ্যান্ডেল করা হয় decode, কমপক্ষে পাইথন 3 এর জন্য

আমি নীচের স্নিপেট ব্যবহার করছি invalid start byteএবং invalid continuation byteত্রুটিগুলি টাইপ করব। যুক্ত করা errors='ignore'আমার জন্য এটি স্থির করে।

with open(out_file, 'rb') as f:
    for line in f:
        print(line.decode(errors='ignore'))

1
অবশ্যই, এই নীরবে তথ্য বাতিল করে দেয়। সেখানে কী থাকার কথা তা খুঁজে বের করা এবং আসল সমস্যাটি ঠিক করা একটি আরও ভাল সমাধান।
ট্রিপলি

14

@Aaronpenne এবং @ সৌম্যআংশ দ্বারা অনুপ্রাণিত

f = open("file.txt", "rb")
text = f.read().decode(errors='replace')

আমি পেয়েছি "AttributeError: 'str' অবজেক্টটির কোনও 'ডিকোড' নেই। নিশ্চিত না কি ভুল হয়েছে?
ভিক্টর ওয়াং

আপনি কি "আরবি" তে বি অন্তর্ভুক্ত করেছিলেন? বিটি বাইট-ফরমেটেড হিসাবে ফাইলটি খোলার জন্য। আপনি যদি আর ব্যবহার করেন তবে এটি স্ট্রিং, এবং ডিকোড অন্তর্ভুক্ত করবেন না।
পুনেরুদ

14

এই সমাধানটি আমার পক্ষে কাজ করেছে:

import pandas as pd
data = pd.read_csv("training.csv", encoding = 'unicode_escape')

11

সহজ সমাধান:

import pandas as pd
df = pd.read_csv('file_name.csv', engine='python')

3
ধন্যবাদ যে সাহায্য!
রুবেন

@ রুবেনকে সাহায্য করতে পেরে আনন্দিত
গিল বাগজিও

2
ধন্যবাদ এটি আমাকে সাহায্য করেছে। আমি পান্ডায় কাজ করছিলাম। আবারও ধন্যবাদ
বাসভরাজ_

@ বাসাবরাজ_কে সাহায্য করার জন্য খুশি
গিল বাগজিও

1
এখানে উপস্থাপিত সকলের জন্য আমার পক্ষে কাজ করা একমাত্র সমাধান।
লুনেসকো

7

নিম্নলিখিত লাইনটি JSON এনকোডারকে আঘাত করছে,

now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps({'current_time': now}) // this is the culprit

আমি এটির জন্য একটি অস্থায়ী সমাধান পেয়েছি

print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })

এটি অস্থায়ী স্থির হিসাবে সঠিক হিসাবে চিহ্নিত করা হচ্ছে (নিশ্চিত নয়)।


5

যদি উপরের পদ্ধতিগুলি আপনার পক্ষে কাজ করে না, আপনি সিএসভি ফাইলের এনকোডিংটি নিজেই পরিবর্তন করতে চাইতে পারেন।

এক্সেল ব্যবহার:

  1. এক্সেল ব্যবহার করে সিএসভি ফাইল খুলুন
  2. "ফাইল মেনু" বিকল্পে নেভিগেট করুন এবং "হিসাবে সংরক্ষণ করুন" ক্লিক করুন
  3. ফাইলটি সংরক্ষণ করার জন্য একটি অবস্থান নির্বাচন করতে "ব্রাউজ করুন" এ ক্লিক করুন
  4. উদ্দেশ্যে করা ফাইলের নাম লিখুন
  5. সিএসভি (কমা বিস্মৃত) (* .csv) বিকল্পটি নির্বাচন করুন
  6. "সরঞ্জামগুলি" ড্রপ-ডাউন বাক্সে ক্লিক করুন এবং "ওয়েব বিকল্পগুলি" ক্লিক করুন
  7. "এনকোডিং" ট্যাবের অধীনে, "এই নথিটি সংরক্ষণ করুন" ড্রপ-ডাউন তালিকা থেকে ইউনিকোড (ইউটিএফ -8) বিকল্পটি নির্বাচন করুন
  8. ফাইলটি সংরক্ষণ করুন

নোটপ্যাড ব্যবহার:

  1. নোটপ্যাড ব্যবহার করে সিএসভি ফাইল খুলুন
  2. "ফাইল"> "হিসাবে সংরক্ষণ করুন" বিকল্পে নেভিগেট করুন
  3. এরপরে, ফাইলটিতে অবস্থান নির্বাচন করুন
  4. সমস্ত ফাইল ( ) হিসাবে সংরক্ষণ করুন হিসাবে সংরক্ষণ করুন বিকল্পটি নির্বাচন করুন
  5. .Csv এক্সটেনশান সহ ফাইলের নাম উল্লেখ করুন
  6. "এনকোডিং" ড্রপ-ডাউন তালিকা থেকে, ইউটিএফ -8 বিকল্পটি নির্বাচন করুন।
  7. ফাইলটি সংরক্ষণ করতে সংরক্ষণ ক্লিক করুন

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


2

উপরে বর্ণিত সমস্ত কাজের ক্ষেত্র চেষ্টা করার পরেও যদি এটি একই ত্রুটিটি ছুড়ে ফেলে তবে আপনি ফাইলটি সিএসভি হিসাবে রফতানি করতে চেষ্টা করতে পারেন (যদি আপনার ইতিমধ্যে থাকে তবে দ্বিতীয়বার)। বিশেষত আপনি যদি সাইকিট লার্ন ব্যবহার করছেন তবে সিএসভি ফাইল হিসাবে ডেটাसेटটি আমদানি করা ভাল।

আমি কয়েক ঘন্টা একসাথে কাটিয়েছি, যেখানে সমাধানটি ছিল এই সহজ। যে ডিরেক্টরিতে অ্যানাকোন্ডা বা আপনার শ্রেণিবদ্ধ সরঞ্জামগুলি ইনস্টল করা আছে সেখানে ডিরেক্টরিতে ফাইলটি CSV হিসাবে রফতানি করুন এবং চেষ্টা করুন।


2

আপনি আপনার নির্দিষ্ট ব্যবহার এবং ইনপুটটির কোনও মানক এনকোডিং ব্যবহার করতে পারেন।

utf-8 ডিফল্ট হয়।

iso8859-1 পশ্চিম ইউরোপের জন্যও জনপ্রিয়।

উদাহরণ: bytes_obj.decode('iso8859-1')

দেখুন: ডকস


1
অন্ধভাবে এনকোডিং অনুমান করার ফলে আরও ত্রুটি হতে পারে। আইসো 8859-1 বা সিপি 1251 ইত্যাদি নির্বাচন না করে আসলে কোন এনকোডিং ফাইলটি ব্যবহার করে তা না জেনে লক্ষণটি সরিয়ে ফেলবে, তবে আপনি যদি ভুল অনুমান করেন তবে আবর্জনা তৈরি করবেন। এটি যদি মাত্র কয়েক বাইট হয় তবে আপনার নজরে নেওয়া এবং আসল ত্রুটিটি ঠিক করতে কয়েক বছর সময় লাগতে পারে ।
ট্রিপলি

0

A5 (ইয়েন ¥) বা 96 (এন-ড্যাশ ) ডিকোড করার উপায়গুলি অনুসন্ধান করার পরিবর্তে মাইএসকিউএলকে বলুন যে আপনার ক্লায়েন্টটি "ল্যাটিন 1" এনকোডড রয়েছে, তবে আপনি ডাটাবেসে "utf8" চান।

ইউটিএফ -8 অক্ষরের সাথে সমস্যায় বিশদটি দেখুন ; আমি যা দেখি তা আমি সংরক্ষণ করি তা নয়

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