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


129

আমি আমার টেক্সট ফাইলে kmeans ক্লাস্টারিং করতে NLTK ব্যবহার করছি যাতে প্রতিটি লাইন একটি নথি হিসাবে বিবেচিত হয়। সুতরাং উদাহরণস্বরূপ, আমার পাঠ্য ফাইলটি এরকম কিছু:

belong finger death punch <br>
hasty <br>
mike hasty walls jericho <br>
jägermeister rules <br>
rules bands follow performing jägermeister stage <br>
approach 

এখন আমি যে ডেমো কোডটি চালানোর চেষ্টা করছি তা হ'ল:

import sys

import numpy
from nltk.cluster import KMeansClusterer, GAAClusterer, euclidean_distance
import nltk.corpus
from nltk import decorators
import nltk.stem

stemmer_func = nltk.stem.EnglishStemmer().stem
stopwords = set(nltk.corpus.stopwords.words('english'))

@decorators.memoize
def normalize_word(word):
    return stemmer_func(word.lower())

def get_words(titles):
    words = set()
    for title in job_titles:
        for word in title.split():
            words.add(normalize_word(word))
    return list(words)

@decorators.memoize
def vectorspaced(title):
    title_components = [normalize_word(word) for word in title.split()]
    return numpy.array([
        word in title_components and not word in stopwords
        for word in words], numpy.short)

if __name__ == '__main__':

    filename = 'example.txt'
    if len(sys.argv) == 2:
        filename = sys.argv[1]

    with open(filename) as title_file:

        job_titles = [line.strip() for line in title_file.readlines()]

        words = get_words(job_titles)

        # cluster = KMeansClusterer(5, euclidean_distance)
        cluster = GAAClusterer(5)
        cluster.cluster([vectorspaced(title) for title in job_titles if title])

        # NOTE: This is inefficient, cluster.classify should really just be
        # called when you are classifying previously unseen examples!
        classified_examples = [
                cluster.classify(vectorspaced(title)) for title in job_titles
            ]

        for cluster_id, title in sorted(zip(classified_examples, job_titles)):
            print cluster_id, title

(যা এখানেও পাওয়া যাবে )

আমি যে ত্রুটিটি পেয়েছি তা হ'ল:

Traceback (most recent call last):
File "cluster_example.py", line 40, in
words = get_words(job_titles)
File "cluster_example.py", line 20, in get_words
words.add(normalize_word(word))
File "", line 1, in
File "/usr/local/lib/python2.7/dist-packages/nltk/decorators.py", line 183, in memoize
result = func(*args)
File "cluster_example.py", line 14, in normalize_word
return stemmer_func(word.lower())
File "/usr/local/lib/python2.7/dist-packages/nltk/stem/snowball.py", line 694, in stem
word = (word.replace(u"\u2019", u"\x27")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 13: ordinal not in range(128)

এখানে কি হচ্ছে?

উত্তর:


133

ফাইলগুলি একটি গোছা হিসাবে পড়া হচ্ছে str, তবে এটি হওয়া উচিত unicode। পাইথন সুস্পষ্টভাবে রূপান্তর করার চেষ্টা করে তবে ব্যর্থ হয়। পরিবর্তন:

job_titles = [line.strip() for line in title_file.readlines()]

এর স্পষ্টতই ডিকোড strকরতে unicode(এখানে ইউটিএফ -8 ধরে নিচ্ছেন):

job_titles = [line.decode('utf-8').strip() for line in title_file.readlines()]

এটি মডিউলটি আমদানি করেcodecs এবং codecs.openঅন্তর্নির্মিতের পরিবর্তে ব্যবহার করেও সমাধান করা যেতে পারে open


2
এই লাইনটি চালাচ্ছে। আমি .deocode ('utf-8')
আমান মাথুর

@ কাঠিররাজা: আপনি কি এর জন্য একটি রেফারেন্স দিতে পারেন? আমি যতদূর জানি, পাইথন 3 তেও, decodeপদ্ধতিটি ইউনিকোড স্ট্রিংয়ের বাইট স্ট্রিংটি ডিকোড করার পছন্দের উপায় হিসাবে থেকে যায়। (যদিও, আমার উত্তর ধরনের পাইথন 3 জন্য সঠিক হয় না - পাইথন 3 জন্য, আমরা থেকে রূপান্তর করতে চেষ্টা করছেন bytesকরার strথেকে বরং strকরার unicode।)
icktoofay

52

এটি আমার পক্ষে ভাল কাজ করে।

f = open(file_path, 'r+', encoding="utf-8")

এনকোডিং প্রকারটি 'utf-8' রয়েছে তা নিশ্চিত করতে আপনি তৃতীয় প্যারামিটার এনকোডিং যুক্ত করতে পারেন

দ্রষ্টব্য: পাইথন 3 এ এই পদ্ধতিটি কার্যকরভাবে কাজ করে, আমি পাইথন 2.7 এ চেষ্টা করি নি try


পাইথনে এটি কাজ করে না TypeError: 'encoding' is an invalid keyword argument for this function
2.7.10

2
পাইথনে এটি কাজ করে না 2.7.10: TypeError: 'encoding' is an invalid keyword argument for this function এটি দুর্দান্ত কাজ করে:import io with io.open(file_path, 'r', encoding="utf-8") as f: for line in f: do_something(line)
বোরহান কাজিমিপুর

2
পাইথন 3.6 এ কবজির মতো কাজ করেছেন অনেক অনেক ধন্যবাদ!
এসআরসি

32

আমার জন্য টার্মিনাল এনকোডিংয়ে সমস্যা ছিল was ইউটিএফ -8 যোগ করা .বাশার্ক সমস্যার সমাধান করেছে:

export LC_CTYPE=en_US.UTF-8

.Bashrc পরে পুনরায় লোড করতে ভুলবেন না:

source ~/.bashrc

3
আমাকে export LC_ALL=C.UTF-8উবুন্টু 18.04.3 এবং পাইথন 3.6.8 এ ব্যবহার করতে হয়েছিল। অন্যথায় এটি আমার সমস্যার সমাধান করে দিয়েছে, ধন্যবাদ।
jbranski

31

আপনি এটি ব্যবহার করে দেখতে পারেন:

import sys
reload(sys)
sys.setdefaultencoding('utf8')

3
এর অর্থ কী? দেখে মনে হচ্ছে এটি বিশ্বব্যাপী কিছু এবং কেবল এই ফাইলটির জন্য প্রযোজ্য নয়।
simeg

2
লক্ষ্য করুন যে
উপরেরটি

12

পাইথোন .6. using ব্যবহার করে উবুন্টুতে 18.04 এ থাকাকালীন আমি উভয়ই সমস্যার সমাধান করেছি:

with open(filename, encoding="utf-8") as lines:

এবং আপনি যদি কমান্ড লাইন হিসাবে সরঞ্জামটি চালাচ্ছেন:

export LC_ALL=C.UTF-8

মনে রাখবেন যে আপনি পাইথন 2.7 এ থাকলে অন্যরকমভাবে এটি পরিচালনা করতে হবে। প্রথমে আপনাকে ডিফল্ট এনকোডিং সেট করতে হবে:

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

এবং তারপরে ফাইলটি লোড করতে আপনাকে অবশ্যই io.openএনকোডিং সেট করতে ব্যবহার করতে হবে :

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

আপনার এখনও env রফতানি করতে হবে

export LC_ALL=C.UTF-8

6

ডকার পাত্রে পাইথন প্যাকেজ ইনস্টল করার চেষ্টা করার সময় আমি এই ত্রুটিটি পেয়েছি। আমার জন্য, সমস্যাটি ছিল ডকার চিত্রটির একটি localeকনফিগার করা নেই। ডকফাইফাইলে নিম্নলিখিত কোড যুক্ত করা আমার জন্য সমস্যার সমাধান করে।

# Avoid ascii errors when reading files in Python
RUN apt-get install -y \
  locales && \
  locale-gen en_US.UTF-8
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'

আমাকে এটি ব্যবহার করতে হয়েছিল: github.com/docker-library/python/issues/13
mayrop

3

সম্পর্কিত এবং যে কোনও ইউনিকোড ত্রুটি সম্পর্কিত অনুসন্ধান করতে ... নিম্নলিখিত কমান্ডটি ব্যবহার করে:

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

আমার পাওয়া

/etc/letsencrypt/options-ssl-nginx.conf:        # The following CSP directives don't use default-src as 

ব্যবহার করে shed, আমি আপত্তিজনক ক্রমটি পেয়েছি। এটি সম্পাদকের ভুল হিসাবে দেখা গেল।

00008099:     C2  194 302 11000010
00008100:     A0  160 240 10100000
00008101:  d  64  100 144 01100100
00008102:  e  65  101 145 01100101
00008103:  f  66  102 146 01100110
00008104:  a  61  097 141 01100001
00008105:  u  75  117 165 01110101
00008106:  l  6C  108 154 01101100
00008107:  t  74  116 164 01110100
00008108:  -  2D  045 055 00101101
00008109:  s  73  115 163 01110011
00008110:  r  72  114 162 01110010
00008111:  c  63  099 143 01100011
00008112:     C2  194 302 11000010
00008113:     A0  160 240 10100000


0

অজগর 3 এর জন্য, ডিফল্ট এনকোডিংটি "utf-8" হবে। বেস ডকুমেন্টেশনে নিম্নলিখিত পদক্ষেপগুলি প্রস্তাবিত: https://docs.python.org/2/library/csv.html#csv- যে কোনও সমস্যার ক্ষেত্রে উদাহরণ

  1. একটি ফাংশন তৈরি করুন

    def utf_8_encoder(unicode_csv_data):
        for line in unicode_csv_data:
            yield line.encode('utf-8')
  2. তারপরে পাঠকের অভ্যন্তরে ফাংশনটি ব্যবহার করুন, যেমন

    csv_reader = csv.reader(utf_8_encoder(unicode_csv_data))

0

পাইথন 3 এক্স বা উচ্চতর

  1. বাইট স্ট্রিমে ফাইল লোড করুন:

    খোলার লাইনের জন্য (= 'ওয়েবসাইট / সূচক। html', 'আরবি'): দেহ = '': ডিকোডডলাইন = লাইন।

  2. গ্লোবাল সেটিং ব্যবহার করুন:

    আমদানি করুন io আমদানি করুন sys.stdout = io.TextIOWrapper (sys.stdout.buffer, এনকোডিং = 'utf-8')


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