ইউনিকোড ডিকোড এরর: 'এসকিআই' কোডেক বাইট 0xd1 পজিশনে ডিকোড করতে পারে না 2: সীমার মধ্যে সীমিত নয় (128)


107

আমি একটি খুব বড় ডেটাসেটের সাথে কাজ করার চেষ্টা করছি যা এর সাথে কিছু মানক অক্ষর নেই। চাকরীর চশমা অনুসারে আমার ইউনিকোড ব্যবহার করা দরকার তবে আমি হতবাক। (এবং বেশ সম্ভবত এটি সব ভুল করছেন wrong)

আমি সিএসভি ব্যবহার করে এটি খুলি:

 15     ncesReader = csv.reader(open('geocoded_output.csv', 'rb'), delimiter='\t', quotechar='"')

তারপরে, আমি এটিকে দিয়ে এনকোড করার চেষ্টা করব:

name=school_name.encode('utf-8'), street=row[9].encode('utf-8'), city=row[10].encode('utf-8'), state=row[11].encode('utf-8'), zip5=row[12], zip4=row[13],county=row[25].encode('utf-8'), lat=row[22], lng=row[23])

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

Traceback (most recent call last):
  File "push_into_db.py", line 80, in <module>
    main()
  File "push_into_db.py", line 74, in main
    district_map = buildDistrictSchoolMap()
  File "push_into_db.py", line 32, in buildDistrictSchoolMap
    county=row[25].encode('utf-8'), lat=row[22], lng=row[23])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 2: ordinal not in range(128)

আমি মনে করি আমার আপনাকে বলা উচিত যে আমি পাইথন ২.7.২ ব্যবহার করছি, এবং এটি জ্যাঙ্গো ১.৪ এ একটি অ্যাপ তৈরির অংশ। আমি এই বিষয়টিতে বেশ কয়েকটি পোস্ট পড়েছি তবে এগুলির কোনওটিই সরাসরি প্রয়োগ করা হবে বলে মনে হয় না। যে কোন সাহায্য সাদরে গৃহীত হবে।

আপনি এটিও জানতে চাইতে পারেন যে সমস্যাটি সৃষ্টিকারী কিছু মানহীন অক্ষর Ñ এবং সম্ভবত É É are


1
আপনার আসল ফাইল এনকোডিং কি? আমি মনে করি আপনার মূল এনকোডিং অনুযায়ী এটি ডিকোড করা উচিত এবং তারপরে utf 8
xiao 啸

এনকোডিংয়ের সম্ভাব্য সদৃশটি "'ascii' কোডেকটি অক্ষরকে এনকোড করতে পারে না ... সীমানায় নয় (128)" [এড .: এবং প্রায় এক মিলিয়ন অন্যান্যও, আমি নিশ্চিত]]
কার্ল ন্যাচেল

উত্তর:


152

ইউনিকোড ইউটিএফ -8 এর সমান নয়। দ্বিতীয়টি পূর্বেরটির জন্য কেবল একটি এনকোডিং

আপনি এটি প্রায় ভুল উপায়ে করছেন। আপনি ইউটিএফ-8- এনকোডড ডেটা পড়ছেন , সুতরাং আপনাকে ইউটিএফ-8-এনকোডযুক্ত স্ট্রিংটিকে একটি ইউনিকোড স্ট্রিংয়ে ডিকোড করতে হবে।

সুতরাং কেবল এটির .encodeসাথে প্রতিস্থাপন করুন .decodeএবং এটি কাজ করা উচিত (যদি আপনার .csv ইউটিএফ-8-এনকোডযুক্ত থাকে)।

যদিও লজ্জার কিছু নেই। আমি বাজি ধরছি 5 টির মধ্যে 3 প্রোগ্রামার এটি প্রথমে বুঝতে সমস্যা হয়েছিল, বেশি না হলে;)

আপডেট: যদি আপনার ইনপুট ডেটাটি ইউটিএফ -8 এনকোডড না হয় তবে অবশ্যই আপনাকে .decode()অবশ্যই যথাযথ এনকোডিং সহ করতে হবে। যদি কিছু না দেওয়া হয় তবে অজগর ASCII ধরে নেয়, যা স্পষ্টতই অ-ASCII- অক্ষরগুলিতে ব্যর্থ হয়।


1
ত্রুটির কারণ পাইথন এটিকে ডিফল্ট এনকোডিং, এএসসিআইআই থেকে স্বয়ংক্রিয়ভাবে ডিকোড করার চেষ্টা করছে যাতে এটি ইউটিএফ -8 এ তার নির্দিষ্ট করে এনকোড করতে পারে। যেহেতু ডেটা বৈধ ASCII নয়, এটি কাজ করে না।
এগ্রিফ

7
নিশ্চিত, কিন্তু যদি এটা UTF8- এনকোড তথ্য (আমি যেমন), তারপর .decode('utf-8')কৌতুক করতে হবে, কিংবা?
ch3ka

অবশ্যই, আপনি সম্ভবত ঠিক আছেন। এই পরিস্থিতিতে আপনি কেন এই নির্দিষ্ট ত্রুটিটি পান তা আমি কেবল ব্যাখ্যা করছি।
এগ্রিফ

1
পারফেক্ট! আপনাকে অনেক ধন্যবাদ. সুতরাং দেখা যাচ্ছে যে এটি .ডিকোড ('ল্যাটিন -১') ছিল - এটি বোঝার কারণ কারণ এটি ছিল Ñ যা আমাকে সমস্যা দিচ্ছিল। আবার! ধন্যবাদ!
jelkimantis

আপনার সমাধানটি কিছু ক্ষেত্রে কাজ করে, তবে যদি আমি এটি ব্যবহার করি তবে আমি আরও একটি ত্রুটি পেয়ে যাব 'ascii' কোডেক অক্ষরটি ইউ '\ xf1' পজিশন 2 এ এনকোড করতে পারে না: সীমানায় নয় (128)
বিকাশ মিশ্র

84

আপনার কোডগুলিতে এই লাইনগুলি যুক্ত করুন:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

5
`অ্যাট্রিবিউটআরার: মডিউল 'সিস'-এর কোনও বৈশিষ্ট্য নেই' সেটডেফাল্টেনকোডিং 'পাইথন 3
তে

বুটে! এটি আমাকে সাহায্য করেছিল।
শাগো মাকিশিমা

1
এটি আমার পাইথন ২.7 এর জন্য কাজ করে, দ্রষ্টব্য, পুনরায় লোড (সিএসস) প্রয়োজন, অন্যথায়, সেটডাফুলটেনকোডিং অ্যাক্সেসযোগ্য হবে না।
ইউ শেন

1
এটাই একমাত্র বিষয় যা আমার জন্য অনেকগুলি এসও প্রশ্নের বাইরে কাজ করে। অনেক ধন্যবাদ!
ফ্রিডো

নাম 'পুনরায় লোড' সংজ্ঞায়িত করা হয়নি
ডেভিড

28

পাইথন 3 ব্যবহারকারীদের জন্য। আপনি করতে পারেন

with open(csv_name_here, 'r', encoding="utf-8") as f:
    #some codes

এটি ফ্লাস্কের সাথেও কাজ করে :)


1
আমি এখানে প্রথম কাউকে সাহায্য করেছি। আমি সাহায্য করেছি জেনে ভাল বোধ হয় :)
Skrmnghrd

1
এবং আপনি আমাকেও সহায়তা করেছেন :) অন্য সমস্ত উত্তর ফাইল পঠনের জন্য কার্যকর হয়নি। এখন এটি লেখার জন্য কীভাবে ঠিক করতে হবে তাও আমার খুঁজে বের করতে হবে;)
ইউজার 2194898

আপনি আমাকে আপনার কোডের লিঙ্কটি পাঠাতে পারেন? আমি সাহায্য করার চেষ্টা করব
Skrmnghrd

9

ত্রুটির মূল কারণটি অজগর দ্বারা গৃহীত ডিফল্ট এনকোডিং হ'ল ASCII। সুতরাং, যদি স্ট্রিং ডেটা দ্বারা এনকোড করার encode('utf8')জন্য ASCII সীমার বাইরে যেমন অক্ষর থাকে যেমন 'hgvcj 파크 파크 387' এর মতো স্ট্রিং থাকে তবে পাইথন ত্রুটি নিক্ষেপ করবে কারণ স্ট্রিংটি প্রত্যাশিত এনকোডিং বিন্যাসে নেই।

যদি আপনি 3.5 সংস্করণের তুলনায় পাইথন সংস্করণটি ব্যবহার করেন তবে পাইথন দ্বারা ধরে নেওয়া ডিফল্ট এনকোডিংটি সেট করা একটি নির্ভরযোগ্য ফিক্স হবে utf8:

import sys
reload(sys)
sys.setdefaultencoding('utf8')
name = school_name.encode('utf8')

এইভাবে অজগর ASCII সীমার বাইরে চলে আসা স্ট্রিংয়ের মধ্যে অক্ষরগুলির প্রত্যাশা করতে সক্ষম হবে।

তবে, আপনি যদি পাইথন সংস্করণ 3.5 বা তার বেশি ব্যবহার করেন তবে পুনরায় লোড () ফাংশনটি উপলভ্য নয়, সুতরাং আপনাকে ডিকোড উদাহরণস্বরূপ এটি ঠিক করতে হবে eg

name = school_name.decode('utf8').encode('utf8')

আপনার উত্তর এবং আমার মধ্যে পার্থক্য কী
খিলি মিলিয়ানা

1
আরো বিস্তারিত. লোকেরা প্রায়শই কার্যকারণ বিশদটি সহায়ক বলে মনে করে। এবং আপনার কোড বিটিডব্লিউ কাজ করে, কোনও অবমাননার উদ্দেশ্যে নয়।
টেমি ফাকুনলে

1
পুনরায় লোড পাইথন 3 এ উপলব্ধ আপনার কেবল এটি আমদানি করতে হবে। আমদানি পুনরায় লোড থেকে
মায়ো

@ মাইও তবে পাইথন ৩-এ কোনও সিএস.সেটফেলফুলটেনকোডিং নেই So সুতরাং পাই 2 \ পাই 3 এর সামঞ্জস্যের প্রসঙ্গে কিছু চেক করা হবে, sys.getdeafultencoding () হতে পারে। এই বিষয়ে একটি পরামর্শ পরামর্শ প্রশংসা করবে। stackoverflow.com/questions/28127513/...
Konst54

2

পাইথন 3 ব্যবহারকারীদের জন্য:

'ascii' থেকে 'latin1' এ এনকোডিং পরিবর্তন করে।

এছাড়াও, আপনি নীচের স্নিপেট ব্যবহার করে শীর্ষ 10000 বাইট পড়ে স্বয়ংক্রিয়ভাবে এনকোডিং সন্ধান করতে পারেন:

import chardet  
with open("dataset_path", 'rb') as rawdata:  
            result = chardet.detect(rawdata.read(10000))  
print(result)

2

আমার কম্পিউটারে ভুল লোকেল সেট ছিল।

আমি প্রথম করেছি

>>> import locale
>>> locale.getpreferredencoding(False)
'ANSI_X3.4-1968'

locale.getpreferredencoding(False)open()আপনি যখন কোনও এনকোডিং সরবরাহ করবেন না তখন সেই ফাংশনটি বলে । আউটপুট হওয়া উচিত 'UTF-8', তবে এক্ষেত্রে এটি ASCII এর কিছু বৈকল্পিক

তারপরে আমি ব্যাশ কমান্ডটি চালিয়ে localeএই আউটপুটটি পেয়েছি

$ locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

সুতরাং, আমি ডিফল্ট উবুন্টু লোকেল ব্যবহার করছিলাম, যার ফলে পাইথন ইউটিএফ -8 এর পরিবর্তে এএসসিআইআই হিসাবে ফাইলগুলি খুলতে পারে। আমাকে আমার লোকেল সেট করতে হয়েছিলen_US.UTF-8

sudo apt install locales 
sudo locale-gen en_US en_US.UTF-8    
sudo dpkg-reconfigure locales

আপনি যদি লোকেল সিস্টেমটি প্রশস্ত করতে না পারেন, আপনি আপনার সমস্ত পাইথন কোডটি এইভাবে শুরু করতে পারেন:

PYTHONIOENCODING="UTF-8" python3 ./path/to/your/script.py

বা কর

export PYTHONIOENCODING="UTF-8"

এটিকে শেলটিতে সেট করতে আপনি এটি চালান।


1

শংসাপত্র তৈরি বা পুনর্নবীকরণের সময় আপনি যদি এই সমস্যাটি সার্টিবোট চালানোর সময় পান তবে দয়া করে নীচের পদ্ধতিটি ব্যবহার করুন

grep -r -P '[^\x00-\x7f]' /etc/apache2 /etc/letsencrypt /etc/nginx

এই আদেশটি মন্তব্যে একটি .conf ফাইলে আপত্তিজনক চরিত্র "´" খুঁজে পেয়েছে। এটিকে অপসারণ করার পরে (আপনি নিজের ইচ্ছামত মন্তব্য সম্পাদনা করতে পারবেন) এবং এনজিনেক্স পুনরায় লোড করার পরে, সমস্ত কিছু আবার কাজ করেছে।

সূত্র: https://github.com/certbot/certbot/issues/5236


0

অথবা আপনি যখন পাইথনটিতে পাঠ্যের সাথে লেনদেন করেন এটি যদি কোনও ইউনিকোড পাঠ্য হয় তবে একটি নোট তৈরি করুন এটি ইউনিকোড।

text=u'unicode text'পরিবর্তে ঠিক সেট করুন text='unicode text'

এটি আমার ক্ষেত্রে কাজ করেছে।


0

ল্যাট এবং লম্বার কারণে এনকোডিং ইউটিএফ 16 দিয়ে খুলুন।

with open(csv_name_here, 'r', encoding="utf-16") as f:

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