Nasıl düzeltilir: “UnicodeDecodeError: 'ascii' codec bileşeni bayt kodunu çözemez”


459
as3:~/ngokevin-site# nano content/blog/20140114_test-chinese.mkd
as3:~/ngokevin-site# wok
Traceback (most recent call last):
File "/usr/local/bin/wok", line 4, in
Engine()
File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 104, in init
self.load_pages()
File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 238, in load_pages
p = Page.from_file(os.path.join(root, f), self.options, self, renderer)
File "/usr/local/lib/python2.7/site-packages/wok/page.py", line 111, in from_file
page.meta['content'] = page.renderer.render(page.original)
File "/usr/local/lib/python2.7/site-packages/wok/renderers.py", line 46, in render
return markdown(plain, Markdown.plugins)
File "/usr/local/lib/python2.7/site-packages/markdown/init.py", line 419, in markdown
return md.convert(text)
File "/usr/local/lib/python2.7/site-packages/markdown/init.py", line 281, in convert
source = unicode(source)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 1: ordinal not in range(128). -- Note: Markdown only accepts unicode input!

Nasıl düzeltebilirim?

Diğer bazı python tabanlı statik blog uygulamalarında, Çince yayın başarıyla yayınlanabilir. Bu uygulama gibi: http://github.com/vrypan/bucket3 . Sitemde http://bc3.brite.biz/ , Çince posta başarıyla yayınlanabilir.


Yanıtlar:


569

tl; dr / hızlı düzeltme

Python 2.x Unicode Zen - Uzun Sürüm

Kaynağı görmeden kök nedenini bilmek zor, bu yüzden genel olarak konuşmam gerekecek.

UnicodeDecodeError: 'ascii' codec can't decode bytegenellikle strASCII olmayan bir Python 2.x'i özgün dizenin kodlamasını belirtmeden bir Unicode dizesine dönüştürmeye çalıştığınızda olur .

Kısacası, Unicode dizeleri herhangi bir kodlama içermeyen tamamen ayrı bir Python dizesidir. Yalnızca Unicode nokta kodlarına sahiptirler ve bu nedenle tüm spektrumdaki herhangi bir Unicode noktasını tutabilirler. Dizeler UTF-8, UTF-16, ISO-8895-1, GBK, Big5 vb. Kodlanmış metin içerir. Dizeler Unicode olarak kodlanır ve Unicodes dizelere kodlanır . Dosyalar ve metin verileri her zaman kodlanmış dizelerde aktarılır.

Markdown modülü yazarları büyük olasılıkla unicode()(istisnanın atıldığı yerlerde) kodun geri kalanına kaliteli bir kapı olarak kullanırlar - ASCII'yi dönüştürür veya mevcut Unicodes dizelerini yeni bir Unicode dizesine yeniden sarar. Markdown yazarları gelen dizenin kodlamasını bilemez, bu nedenle Markdown'a geçmeden önce dizeleri Unicode dizelerine deşifre etmenize güvenir.

Unicode dizeleri kodunuzda u önek . Örneğin

>>> my_u = u'my ünicôdé strįng'
>>> type(my_u)
<type 'unicode'>

Unicode dizeleri dosya, veritabanları ve ağ modüllerinden de gelebilir. Bu olduğunda, kodlama hakkında endişelenmenize gerek yoktur.

Sorunlar

strAçıkça aramasanız bile, Unicode'a dönüşüm gerçekleşebilirunicode() .

Aşağıdaki senaryolar UnicodeDecodeErroristisnalara neden olur :

# Explicit conversion without encoding
unicode('€')

# New style format string into Unicode string
# Python will try to convert value string to Unicode first
u"The currency is: {}".format('€')

# Old style format string into Unicode string
# Python will try to convert value string to Unicode first
u'The currency is: %s' % '€'

# Append string to Unicode
# Python will try to convert string to Unicode first
u'The currency is: ' + '€'         

Örnekler

Aşağıdaki şemada, caféterminal tipine bağlı olarak kelimenin "UTF-8" veya "Cp1252" kodlamasında nasıl kodlandığını görebilirsiniz . Her iki örnekte cafde sadece düzenli ascii. UTF-8'de éiki bayt kullanılarak kodlanır. "Cp1252" de, é 0xE9'dur (bu aynı zamanda Unicode nokta değeri de olur (tesadüf değildir)). Doğru decode()çağrılır ve bir Python Unicode'a dönüştürme başarılı olur: Python Unicode dizesine dönüştürülen bir dizenin diyagramı

Bu şemada, decode()ile çağrılır ascii( unicode()verilen kodlama olmadan çağrı ile aynıdır ). ASCII'den daha büyük bayt içeremediğinden 0x7F, bu bir UnicodeDecodeErroristisna oluşturur:

Yanlış kodlamaya sahip bir Python Unicode dizesine dönüştürülen bir dizenin diyagramı

Unicode Sandviç

Kodunuzda Unicode sandviç oluşturmak, tüm gelen verileri Unicode dizelerine kodlamak, Unicodes ile çalışmak ve sonra kodlamak için iyi bir uygulamadır. str iyi bir uygulamadır. Bu, kodunuzun ortasındaki dizelerin kodlanması konusunda endişelenmenizi önler.

Giriş / Kod Çözme

Kaynak kodu

ASCII olmayan kaynak kodunuzu pişirmek gerekiyorsa, dizeye bir önek ekleyerek Unicode dizeleri oluşturun u. Örneğin

u'Zürich'

Python'un kaynak kodunuzun kodunu çözmesine izin vermek için, dosyanızın gerçek kodlamasına uygun bir kodlama başlığı eklemeniz gerekir. Örneğin, dosyanız 'UTF-8' olarak kodlanmışsa, şunu kullanırsınız:

# encoding: utf-8

Bu, yalnızca ASCII olmayan cihazlarınızda kaynak kodunuzda kod .

Dosyalar

Genellikle ASCII olmayan veriler bir dosyadan alınır. ioModül, belirli kullanarak, anında dosyanızı çözen bir TextWrapper sağlar encoding. Dosya için doğru kodlamayı kullanmalısınız - kolayca tahmin edilemez. Örneğin, UTF-8 dosyası için:

import io
with io.open("my_utf8_file.txt", "r", encoding="utf-8") as my_file:
     my_unicode_string = my_file.read() 

my_unicode_stringdaha sonra Markdown'a geçmek için uygun olacaktır. Satırdan bir UnicodeDecodeErrorise, read()muhtemelen yanlış kodlama değerini kullandınız.

CSV Dosyaları

Python 2.7 CSV modülü ASCII olmayan karakterleri 😩 desteklemez. Ancak https://pypi.python.org/pypi/backports.csv ile yardım elinizin altında .

Yukarıdaki gibi kullanın, ancak açılan dosyayı ona iletin:

from backports import csv
import io
with io.open("my_utf8_file.txt", "r", encoding="utf-8") as my_file:
    for row in csv.reader(my_file):
        yield row

Veritabanları

Çoğu Python veritabanı sürücüsü Unicode'da veri döndürebilir, ancak genellikle küçük bir yapılandırma gerektirir. SQL sorguları için her zaman Unicode dizelerini kullanın.

MySQL

Bağlantı dizesine şunu ekleyin:

charset='utf8',
use_unicode=True

Örneğin

>>> db = MySQLdb.connect(host="localhost", user='root', passwd='passwd', db='sandbox', use_unicode=True, charset="utf8")
PostgreSQL

Ekle:

psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)

HTTP

Web sayfaları hemen hemen her kodlamayla kodlanabilir. Content-typeBaşlık bir içermelidir charsetkodlama ipucu alanını. Daha sonra içerik bu değere göre manuel olarak çözülebilir. Alternatif olarak, Python-Requests , içinde Unicodes döndürür response.text.

el ile

Dizeleri manuel olarak deşifre etmeniz gerekiyorsa , uygun kodlamanın my_string.decode(encoding)nerede encodingolduğunu basitçe yapabilirsiniz . Python 2.x destekli kodekler burada verilmektedir: Standart Kodlamalar . Yine, eğer alırsanız UnicodeDecodeErrormuhtemelen yanlış kodlamaya sahip olursunuz.

Sandviç eti

Normal strlerde olduğu gibi Unicodes ile çalışın.

Çıktı

stdout / yazdırma

printstdout akışı üzerinden yazar. Python, Unicodes'un konsolun kodlamasına kodlanması için stdout'ta bir kodlayıcı yapılandırmaya çalışır. Örneğin, bir Linux kabuğu localeise en_GB.UTF-8, çıktı kodlanacaktır UTF-8. Windows'da, 8 bitlik bir kod sayfasıyla sınırlı olacaksınız.

Bozuk yerel ayar gibi yanlış yapılandırılmış bir konsol beklenmeyen yazdırma hatalarına neden olabilir. PYTHONIOENCODINGortam değişkeni stdout için kodlamayı zorlayabilir.

Dosyalar

Giriş gibi, io.openUnicodes'i kodlanmış bayt dizelerine şeffaf olarak dönüştürmek için kullanılabilir.

Veri tabanı

Aynı okuma konfigürasyonu Unicodes'un doğrudan yazılmasına izin verecektir.

Python 3

Python 3, Python 2.x'ten daha fazla Unicode yeteneğine sahip değildir, ancak konuyla ilgili biraz daha az karışıktır. Örneğin, normal strartık bir Unicode dizesi ve eski strartık bytes.

Varsayılan kodlama UTF-8'dir, bu nedenle .decode()kodlama yapmadan bir bayt dizesi kullanırsanız, Python 3 UTF-8 kodlamasını kullanır. Bu muhtemelen insanların Unicode sorunlarının% 50'sini giderir.

Ayrıca, open()varsayılan olarak metin modunda çalışır, bu nedenle kodu çözülmüş str(Unicode olanlar) döndürür . Kodlama, Un * x sistemlerinde UTF-8 veya Windows kutularında windows-1251 gibi 8 bit kod sayfası olma eğiliminde olan yerel ayarınızdan türetilir.

Neden kullanmamalısın sys.setdefaultencoding('utf8')

Sadece reloadsorunları maskeleyecek ve Python 3.x'e geçişinizi engelleyecek kötü bir kesmek (kullanmanız için bir neden var ). Sorunu anlayın, temel nedeni düzeltin ve Unicode zen'in tadını çıkarın. Bkz. Neden bir py betiğinde sys.setdefaultencoding ("utf-8") kullanmamalıyız? daha fazla detay için


2
Python 2 cevaplarını arayan biri için, daha kullanışlı bir TLDR: io.opendosyaları okumak / yazmak için kullanın from __future__ import unicode_literals, kullanın , diğer veri girişlerini / çıkışlarını (örn. Veritabanları) unicode kullanacak şekilde yapılandırın.
idbrii

sooo nasıl düzeltebiliriz? lol bu bir senaryo yazmaktan bir sorun değil - bir tane kurmaktan
Matthew

@Matthew ayarlamayı deneyin PYTHONIOENCODING=utf-8. Bu sorunu çözmezse kodlarını düzeltmek için komut dosyasının yazarına başvurmanız gerekir.
Alastair McCormack

498

Sonunda anladım:

as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py
# encoding=utf8  
import sys  

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

Kontrol edeyim:

as3:~/ngokevin-site# python
Python 2.7.6 (default, Dec  6 2013, 14:49:02)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.getdefaultencoding()
'utf8'
>>>

Yukarıda python'un varsayılan kodlaması gösterilmiştir utf8. O zaman hata artık yok.


7
Bunu deniyorum ama kodlamayı kalıcı olarak değiştiremedi. Bir kez python konsolundan çıkıp tekrar başlayın, kodlama hala aynı
macemers

37
Teşekkürler! Peki neden sys'i içe aktardıktan sonra yeniden yüklememiz gerekiyor?
Dmiters

6
@DmitryNarkevich, Yanıltıcı setdefaultencoding işlevi nedeniyle . Python başlangıcında silinir, çünkü görünüşe göre ilk etapta uygun bir sürümün parçası olmamalıdır.
predi

3
Bu, temel nedeni düzeltmediğiniz anlamına gelir. Herhangi bir zımni dönüşüme
Alastair McCormack

5
@miraculixx Python 3'ün varsayılan kodlaması, varsayılan olarak Unicode dizeleriyle UTF-8'dir str, bu nedenle gecikmiş değildir. Python 2.x'te, Unicode geçiş durumundaydı, bu nedenle baytları Unicodes'a dönüştürürken kodlama varsaymak tehlikeli olurdu. Bu nedenle, Py2'nin varsayılan ASCII kodlaması kasıtlı bir seçimdi ve varsayılan kodlamanın değiştirilmesinin neden kasıtlı yeniden yükleme hackini gerektirdiğini sys. Py2'de kodlama hatalarını ortadan kaldırmanın doğru yolu, dönüştürmeler gerektiğinde dizelerin UTF-8 kodlu olduğunu varsaymakla kalmaz, kodları Unicode'a açıkça kodlamak ve kodlamaktır.
Alastair McCormack

130

Bu klasik "unicode sorunu" dur. Bunu açıklamanın, neler olduğunu tamamen açıklamak için bir StackOverflow cevabının kapsamı dışında olduğuna inanıyorum.

İyi açıklanmıştır burada .

Çok kısa bir özette, Bayt dizesi olarak yorumlanan bir şeyi Unicode karakterlerine kodlaması gereken bir şeye geçtiniz, ancak varsayılan kodek (ascii) başarısız oluyor.

Sizi işaret ettiğim sunum bundan kaçınmak için tavsiyelerde bulunuyor. Kodunuzu "unicode sandviç" yapın. Python 2'de from __future__ import unicode_literalsyardımcıların kullanımı .

Güncelleme: kod nasıl düzeltilebilir:

Tamam - değişken "kaynağınızda" bazı baytlarınız var. Sorunuza oraya nasıl ulaştıkları belli değil - belki bir web formundan okudunuz mu? Her durumda, ascii ile kodlanmamışlar, ancak python oldukları varsayılırsa onları unicode'a dönüştürmeye çalışıyor. Kodlamanın ne olduğunu açıkça söylemeniz gerekir. Bu araçlar size gerektiğini biliyoruz kodlama ne olduğunu! Bu her zaman kolay değildir ve tamamen bu dizenin nereden geldiğine bağlıdır. Bazı ortak kodlamaları deneyebilirsiniz - örneğin UTF-8. Kodlamayı unicode () yöntemine ikinci bir parametre olarak söylersiniz:

source = unicode(source, 'utf-8')

1
hala bir baş ağrısı. mr GreenAsJade, bana somut bir çözüm verebilir misiniz?
balıkçı

1
"Bu blogun bir kullanıcısı olarak bu sorunu nasıl önleyebilirim?" Diye soruyor musunuz? Veya "bu sorun oluşmaması için kodu nasıl düzeltebilirim?" Sorusu mu?
GreenAsJade

2
mr greenasjade: nereye "kaynak = unicode (kaynak, 'utf-8')" koymalıyım?
balıkçı

7
Tuhaf ... bir yılı aşkın olumlu geribildirimden sonra, aniden iki olumsuz oylama ... Ha?
GreenAsJade

11
kullanın currentFile = open(filename, 'rt', encoding='latin1')veya currentFile = open(filename, 'rt', encoding='utf-8')- buraya bakın: stackoverflow.com/a/23917799/2047442
irudyak

42

Bazı durumlarda, varsayılan kodlamanızı ( print sys.getdefaultencoding()) kontrol ettiğinizde ASCII kullandığınızı döndürür. UTF-8 olarak değiştirirseniz, değişkeninizin içeriğine bağlı olarak çalışmaz. Başka bir yol buldum:

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

ty, bu unicodeDecodeError var = u "" "büyük dize" "" atma ile sorunum için çalıştı
user2426679

AttributeError: 'sys' modülünün 'setdefaultencoding' özelliği yok
Chaine

ve reload(sys)bu nedenle kullanılır.
Marcin Orlowski

1
Benim için çalıştı! TEŞEKKÜRLER !
Maciej

22

Aşağıdaki hata mesajını çözmek için arama yapıyordum:

unicodedecodeerror: 'ascii' codec bileşeni 5454 konumunda bayt 0xe2 kodunu çözemiyor: sıra değeri aralıkta değil (128)

Sonunda 'kodlama' belirterek düzeltildi:

f = open('../glove/glove.6B.100d.txt', encoding="utf-8")

Sana da yardım etsin.


Bu, .csv dosyalarını okurken / yazarken benim için hatayı çözdü, diğer cevaplarda listelenen diğer şeylere gerek yoktu
user5359531

Diğer cevapların neden bu kadar çok ayrıntı verdiğini anlamıyorum ... ama bu basit çözümü unutun. 10!
stan0

18
"UnicodeDecodeError: 'ascii' codec can't decode byte"

Bu hatanın nedeni: input_string unicode olmalı, ancak str verildi

"TypeError: Decoding Unicode is not supported"

Bu hatanın nedeni: unicode input_string öğesini unicode'a dönüştürmeye çalışıyor


İlk olarak input_string'inizin olup olmadığını kontrol edin strve gerekirse unicode'a dönüştürün:

if isinstance(input_string, str):
   input_string = unicode(input_string, 'utf-8')

İkincisi, yukarıdakiler sadece türü değiştirir ancak ascii olmayan karakterleri kaldırmaz. Ascii olmayan karakterleri kaldırmak istiyorsanız:

if isinstance(input_string, str):
   input_string = input_string.decode('ascii', 'ignore').encode('ascii') #note: this removes the character and encodes back to string.

elif isinstance(input_string, unicode):
   input_string = input_string.encode('ascii', 'ignore')

9

En iyisi her zaman unicode'a dönüştürmektir - ancak bunu başarmak zordur çünkü pratikte her argümanı kontrol etmek ve herhangi bir dize işleme biçimini içeren her işleve ve yönteme dönüştürmek zorunda kalacaksınız.

Bu yüzden her iki girişten de unicodes veya bayt dizelerini garanti etmek için aşağıdaki yaklaşımı buldum. Kısacası, aşağıdaki lambdasları ekleyin ve kullanın :

# guarantee unicode string
_u = lambda t: t.decode('UTF-8', 'replace') if isinstance(t, str) else t
_uu = lambda *tt: tuple(_u(t) for t in tt) 
# guarantee byte string in UTF8 encoding
_u8 = lambda t: t.encode('UTF-8', 'replace') if isinstance(t, unicode) else t
_uu8 = lambda *tt: tuple(_u8(t) for t in tt)

Örnekler:

text='Some string with codes > 127, like Zürich'
utext=u'Some string with codes > 127, like Zürich'
print "==> with _u, _uu"
print _u(text), type(_u(text))
print _u(utext), type(_u(utext))
print _uu(text, utext), type(_uu(text, utext))
print "==> with u8, uu8"
print _u8(text), type(_u8(text))
print _u8(utext), type(_u8(utext))
print _uu8(text, utext), type(_uu8(text, utext))
# with % formatting, always use _u() and _uu()
print "Some unknown input %s" % _u(text)
print "Multiple inputs %s, %s" % _uu(text, text)
# but with string.format be sure to always work with unicode strings
print u"Also works with formats: {}".format(_u(text))
print u"Also works with formats: {},{}".format(*_uu(text, text))
# ... or use _u8 and _uu8, because string.format expects byte strings
print "Also works with formats: {}".format(_u8(text))
print "Also works with formats: {},{}".format(*_uu8(text, text))

İşte bunun için biraz daha akıl yürütme .


Merhaba, Python 3'te _u işlevi bu değer 'Ita £' ile çalışmaz.
Martin

1
Tamam, "akıl yürütme" nizden nereden başlamalı? print unicode(u'Zürich', encoding="UTF-8")ve sonra şikayet "Ama şaşırtıcı unicode ext UTF8 kodlamak olamaz". unicode()kodlamıyor; kodu çözer ve bir Unicode'un kodunu çözemezsiniz - zaten kodu çözülmüştür!
Alastair McCormack

@AlastairMcCormack Gönderiyi geliştirmeye açıksınız. Bununla birlikte, üstünlük iddianızı, görüşünüzü ve görüşünüzü paylaşmayan herkes üzerine serpiştirmeyi tercih ederseniz, açıkçası ilgilenmiyorum. Teşekkür ederim.
miraculixx

3
@miraculixx Üzgünüm, pislik gibi rastlamak istememiştim. Kodunuzda bir dize her kullandığınızda kod çözme ve kodlama konusunda endişelenmeniz sadece gereksizdir.
Alastair McCormack

7

Bunu bir Ubuntu kurulumunda işletim sistemi düzeyinde çözmek için aşağıdakileri kontrol edin:

$ locale charmap

Alırsan

locale: Cannot set LC_CTYPE to default locale: No such file or directory

onun yerine

UTF-8

sonra bunu ayarlayın LC_CTYPEve LC_ALLbeğenin:

$ export LC_ALL="en_US.UTF-8"
$ export LC_CTYPE="en_US.UTF-8"

6

Encode, bir unicode nesnesini bir dize nesnesine dönüştürür. Sanırım bir dize nesnesini kodlamaya çalışıyorsunuz. önce sonucunuzu unicode nesnesine dönüştürün ve sonra bu unicode nesnesini 'utf-8' olarak kodlayın. Örneğin

    result = yourFunction()
    result.decode().encode('utf-8')

4

Aynı sorunu vardı ama Python 3 için işe yaramadı. Bunu takip ettim ve sorunumu çözdü:

enc = sys.getdefaultencoding()
file = open(menu, "r", encoding = enc)

Dosyayı okurken / yazarken kodlamayı ayarlamanız gerekir.


4

Aynı hata var ve bu benim hatamı çözdü. Teşekkürler! Unicode işlemede farklı olan python 2 ve python 3, turşu dosyalarını yüklemek için oldukça uyumsuz hale getiriyor. Yani python turşusunun kodlama argümanını kullanın. Aşağıdaki bağlantı, dosyamı ilk olarak python 2.x sürümünde kaydedilmişken, python 3.7'den turşu verilerini açmaya çalışırken benzer sorunu çözmeme yardımcı oldu. https://blog.modest-destiny.com/posts/python-2-and-3-compatible-pickle-save-and-load/ Betiğimi yüklerken load_pickle işlevini kopyaladım ve load_pickle (pickle_file) olarak adlandırdım input_data şöyle:

input_data = load_pickle("my_dataset.pkl")

Load_pickle işlevi burada:

def load_pickle(pickle_file):
    try:
        with open(pickle_file, 'rb') as f:
            pickle_data = pickle.load(f)
    except UnicodeDecodeError as e:
        with open(pickle_file, 'rb') as f:
            pickle_data = pickle.load(f, encoding='latin1')
    except Exception as e:
        print('Unable to load data ', pickle_file, ':', e)
        raise
    return pickle_data

1
load_picklecevabınıza fonksiyon tanımını eklemek daha iyidir .
sanyash

4

Bu benim için çalıştı:

    file = open('docs/my_messy_doc.pdf', 'rb')

3

Kısacası, Python 2'de uygun unicode işlemeyi sağlamak için:

  • io.opendosyaları okumak / yazmak için kullanın
  • kullanım from __future__ import unicode_literals
  • diğer veri girişlerini / çıkışlarını (ör. veritabanları, ağ) unicode kullanacak şekilde yapılandırma
  • çıkışları utf-8 olarak yapılandıramıyorsanız, çıkışınızı onlar için dönüştürün print(text.encode('ascii', 'replace').decode())

Açıklamalar için @Alastair McCormack'ın ayrıntılı cevabına bakınız .


io.open(path, 'r', encoding='utf-8')utf-8 kodlu dosyaları okumak için kullanın .
Bob Stein

3

Aynı hatayla, ASCII olmayan karakterler (değerleri> 128 ile bayt) içeren URL'lerle benim çözümüm vardı:

url = url.decode('utf8').encode('utf-8')

Not: utf-8, utf8 basitçe takma adlardır. Yalnızca 'utf8' veya 'utf-8' kullanıldığında aynı şekilde çalışılmalıdır

Python 2.7, benim için çalıştı benim durumda, ben bu atama içinde 'bir şey' değişti varsayalım striç gösterimi - yani içeri destekli bayt dizisinin sağ çözme zorlar urlve son olarak bir dizesi koyar utf-8 str ile tüm büyüler doğru yerde. Python'daki Unicode benim için kara büyü. Umut yararlı


1
Neden biri değil diğeri bir çizgi
IgorGanapolsky

1
Python isimleri kodlamak için takma adları kabul etti, şimdi denedim ve aynı şeyi yaptım ... basitçe onları farklı yazdığımı fark etmedim, not ekledi
Fabiano Tarlao 29:18

2

Ben "PastelerÃa Mallorca" dize ile aynı sorunu var ve ben çözüldü:

unicode("Pastelería Mallorca", 'latin-1')

1

Django (1.9.10) / Python 2.7.5 projesinde sık sık UnicodeDecodeErroristisnalarım var; özellikle unicode dizelerini günlüğe kaydetmeye çalıştığımda. Temelde 8-bit ASCII dizeleri biçimlendirmek ve tabloda olmayan herhangi bir karakteri '?' Yerine rasgele nesneler için bir yardımcı işlevi yaptım. Bence bu en iyi çözüm değil ama varsayılan kodlama ASCII (ve ben değiştirmek istemiyorum) çünkü yapacağız:

def encode_for_logging (c, encoding = 'ascii'):
    eğer isinstance (c, basestring):
        return c.encode (kodlama, 'değiştir')
    elif isinstance (c, Tekrarlanabilir):
        c_ = []
        c cinsinden v için:
            c_.append (encode_for_logging (v, kodlama))
        dönüş c_
    Başka:
        dönüş encode_for_logging (unicode (c))
'


1

Bu hata, dizemizde ASCII olmayan bazı karakterler olduğunda ve bu kodda uygun kod çözme olmadan herhangi bir işlem gerçekleştirdiğimizde ortaya çıkar. Bu, sorunumu çözmeme yardımcı oldu. Ben sütun ID, Metin ve kod çözme karakterleri ile bir CSV dosyası aşağıdaki gibi okuyorum:

train_df = pd.read_csv("Example.csv")
train_data = train_df.values
for i in train_data:
    print("ID :" + i[0])
    text = i[1].decode("utf-8",errors="ignore").strip().lower()
    print("Text: " + text)

0

İşte benim çözüm, sadece kodlama ekleyin. with open(file, encoding='utf8') as f

Ve eldiven dosyasını okumak uzun zaman alacağından, eldiven dosyasını nümerik bir dosyaya öneriyorum. Netx süresi gömme ağırlıklarını okuduğunuzda zaman kazanır.

import numpy as np
from tqdm import tqdm


def load_glove(file):
    """Loads GloVe vectors in numpy array.
    Args:
        file (str): a path to a glove file.
    Return:
        dict: a dict of numpy arrays.
    """
    embeddings_index = {}
    with open(file, encoding='utf8') as f:
        for i, line in tqdm(enumerate(f)):
            values = line.split()
            word = ''.join(values[:-300])
            coefs = np.asarray(values[-300:], dtype='float32')
            embeddings_index[word] = coefs

    return embeddings_index

# EMBEDDING_PATH = '../embedding_weights/glove.840B.300d.txt'
EMBEDDING_PATH = 'glove.840B.300d.txt'
embeddings = load_glove(EMBEDDING_PATH)

np.save('glove_embeddings.npy', embeddings) 

Gist bağlantısı: https://gist.github.com/BrambleXu/634a844cdd3cd04bb2e3ba3c83aef227


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.