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!
Cum să o rezolvi?
În alte python bazate pe statice blog aplicații, Chineză post pot fi publicate cu succes. Cum ar fi această aplicație: http://github.com/vrypan/bucket3. În site-ul meu http://bc3.brite.biz/, Chineză post pot fi publicate cu succes.
Fără să vadă sursa de it's greu să știu cauza rădăcină, așa că am'll trebuie să vorbesc în general.
UnicodeDecodeError: 'ascii' codec poate't decode octet
, în general, se întâmplă atunci când încercați pentru a converti un Piton 2.x str
care conține non-ASCII la un șir Unicode fără a specifica codificarea șirul original.
Pe scurt, siruri de caractere Unicode sunt complet separate tip de Python șir care nu conține nici o codare. Se ține numai Unicode punct de coduri și, prin urmare, poate deține orice Unicode punct de-a lungul întregului spectru. Siruri de caractere conține textul codificat, beit UTF-8, UTF-16, ISO 8895-1, GBK, Big5 etc. Siruri de caractere sunt decodate pentru Unicode și Unicodes sunt codificate la siruri de caractere. Fișiere și date de tip text sunt întotdeauna transferate în codificate siruri de caractere.
Markdown modulul de autori, probabil folosesc unicode()` (în cazul în care excepția este aruncată) ca o poarta de calitate pentru restul de cod - se va converti ASCII sau re-folie existente Unicodes siruri de caractere pentru un nou șir Unicode. Markdown autorii pot't știu codificarea șirul de intrare astfel încât se va baza pe tine pentru a decoda siruri siruri de caractere Unicode înainte de a trece la Reduceri.
Siruri de caractere Unicode pot fi declarate în codul dvs. folosind " u " prefix pentru siruri de caractere. E. g.
>>> my_u = u'my ünicôdé strįng'
>>> type(my_u)
<type 'unicode'>
Siruri de caractere Unicode poate veni, de asemenea, de la fișiere, baze de date și rețeaua de module. Când acest lucru se întâmplă, nu't nevoie să vă faceți griji despre codare.
Conversia de la str
pentru Unicode poate întâmpla chiar și atunci când tu nu't a apela în mod explicit unicode()
.
Următoarele scenarii cauza UnicodeDecodeError` excepții:
# 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: ' + '€'
În diagrama de mai jos, puteți vedea cum cuvântul café
a fost codificat în "UTF-8" sau "Cp1252" de codificare în funcție de tipul de terminal. În ambele exemple, caf
este ascii. În UTF-8, é
este codificat folosind doi octeți. În "Cp1252", é este 0xE9 (care este, de asemenea, se întâmplă să fie Unicode valoare punct (e's nu este o coincidență)). Corect decoda()
este invocat și de conversie de la un Piton Unicode este de succes:
În această diagramă, decoda()
este numit cu ascii
(ceea ce este la fel de asteptare pentru unicode()fără o codificare dat). Ca ASCII poate't conțin octeți mai mare decât
0x7F, acest lucru va arunca o UnicodeDecodeError
excepție:
L's de bune practici pentru a forma un Unicode sandwich în cod, în cazul în care vă decoda toate apelurile de date pentru siruri de caractere Unicode, lucru cu Unicodes, apoi codifica pentru `str e pe cale de ieșire. Acest lucru vă salvează de la griji despre codificarea de siruri de caractere în mijlocul de cod.
Dacă aveți nevoie pentru a coace non-ASCII în codul sursă, de a crea doar siruri de caractere Unicode prin prefixarea șir cu un "u". E. g.
u'Zürich'
Pentru a permite Python pentru a decoda codul sursă, va trebui să adăugați un antet de codare pentru a se potrivi cu efective de codificare de fișiere. De exemplu, dacă fișierul a fost codificat ca 'UTF-8', le-ar folosi:
# encoding: utf-8
Acest lucru este necesar doar atunci când aveți non-ASCII în codul sursă.
De obicei, non-ASCII datele sunt primite de la un fișier. De io
modulul oferă o TextWrapper care decodează fișierul dvs. pe zbor, folosind o dat codare
. Trebuie să utilizați codificarea corectă pentru fișier - se poate't fi ușor de ghicit. De exemplu, pentru un UTF-8 fișiere:
import io
with io.open("my_utf8_file.txt", "r", encoding="utf-8") as my_file:
my_unicode_string = my_file.read()
my_unicode_string
ar fi potrivit pentru a trece la Reduceri. Dacă o UnicodeDecodeError "de la" read()
linie, apoi'am folosit, probabil, greșit codare valoare.
Python 2.7 CSV modulul nu are suport pentru caractere non-ASCII 😩. Ajutorul este la îndemână, cu toate acestea, cu https://pypi.python.org/pypi/backports.csv. Folositi-l ca mai sus, dar trece fișier deschis pentru ea:
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
Cele mai Python drivere de baze de date pot returna date în Unicode, dar de obicei necesita un pic de configurare. Întotdeauna utilizați siruri de caractere Unicode pentru interogări SQL.
În șirul de conexiune adauga:
charset='utf8',
use_unicode=True
E. g.
>>> db = MySQLdb.connect(host="localhost", user='root', passwd='passwd', db='sandbox', use_unicode=True, charset="utf8")
Adauga:
psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)
Paginile Web pot fi codificate în doar despre orice codificare. La "Content-type" antet ar trebui să conțină o charset
câmp să aluzie la codare. Conținutul poate fi apoi decodat manual împotriva acestei valori. Alternativ, Python-Cereri a se întoarce Unicodes în răspuns.text`.
Dacă trebuie să decodeze siruri de caractere manual, puteți face pur și simplu my_string.decode(codare)", unde " codare este corespunzătoare codare. Python 2.x codecuri suportate sunt prezentate aici: [Standard Codificări][5]. Din nou, dacă te
UnicodeDecodeError` apoi'am primit, probabil, greșit codare.
Lucra cu Unicodes ca tine ar fi normal str.
"imprimare" scrie prin fluxul stdout. Python încearcă să configurați un encoder pe stdout, astfel încât Unicodes sunt codificate la consola's codare. De exemplu, dacă un Linux shell's locale
este ro_ro.UTF-8
, la ieșire va fi codificat pentru "UTF-8". Pe Windows, va fi limitat la un 8bit pagina de cod.
O incorect configurat consola, cum ar fi corupt locale, poate duce la neașteptată erori de imprimare. PYTHONIOENCODING
variabila de mediu pot vigoare codificarea pentru stdout.
Doar ca input, io.deschide
poate fi folosit pentru a transparent converti Unicodes să codificate siruri de caractere octet.
Aceeași configurație pentru lectură va permite Unicodes să fie scrise în mod direct.
Python 3 nu mai Unicode capabil decât Python 2.x este, cu toate acestea, este mai puțin confuz cu privire la acest subiect. E. g regulat str
este acum un șir Unicode și vechi str
este acum bytes. Codarea implicită este UTF-8, deci, dacă tu
.decode()un octet de coarde, fără a da o codificare, Python 3 utilizează codificarea UTF-8. Acest lucru, probabil, remedieri 50% dintre oameni's Unicode probleme. Mai mult,
open()operează în modul text în mod implicit, așa că se întoarce decodat
str` (Unicode altele). Codificarea este derivat din zona dvs., care tinde să fie UTF-8 pe Un*x sisteme sau un 8-bit cod de pagină, cum ar fi windows-1251, pe Windows cutii.
L's-o urât hack (nu's un motiv pentru care trebuie să utilizați "reload"), care va masca numai probleme și de a împiedica migrarea la Python 3.x. Înțeleg problema, rezolva cauza rădăcină și bucurați-vă de Unicode zen. Vezi https://stackoverflow.com/questions/3828723/why-should-we-not-use-sys-setdefaultencodingutf-8-in-a-py-script/34378962#34378962 pentru mai multe detalii
În cele din urmă am luat-o:
as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py
# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Lasă-mă să verificați:
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'
>>>
De mai sus arată codificare implicită de python este utf8
. Apoi, eroarea nu mai este.
Acest lucru este clasic "unicode problema". Cred că a explica acest lucru este dincolo de sfera de un StackOverflow răspuns pentru a explica complet ceea ce se întâmplă.
Este bine explicat aici.
În foarte scurt rezumat, ai trecut de ceva care este interpretată ca un șir de octeți pentru ceva care trebuie să-l decodifice în caractere Unicode, dar implicit codec (ascii) este faptul că nu.
Prezentarea am arătat să oferă sfaturi pentru a evita acest lucru. Face codul "unicode sandwich". În Python 2, utilizarea de viitoarele import unicode_literals` ajută.
Update: cum poate codul fi reparate:
OK - în variabila "sursa" ai niste bytes. Nu este clar la întrebarea cum au ajuns acolo - poate le-ai citit dintr-un formular web? În orice caz, ele nu sunt codificate cu ascii, dar python este încercarea de a le converti la unicode presupunând că acestea sunt. Ai nevoie pentru a spune în mod explicit că ceea ce codificarea este. Acest lucru înseamnă că aveți nevoie pentru a know ce codificarea este! Că nu este întotdeauna ușor, și depinde în întregime de unde acest șir a venit de la. Ai putea experimenta cu unele comune codificări - de exemplu UTF-8. Spune-unicode() codificarea, ca al doilea parametru:
source = unicode(source, 'utf-8')
În unele cazuri, atunci când verificați codificare implicită (print sys.getdefaultencoding()
), se întoarce pe care îl utilizați ASCII. Dacă vă schimbați la UTF-8, nu't de lucru, în funcție de conținutul de variabile.
Am găsit un alt mod:
import sys
reload(sys)
sys.setdefaultencoding('Cp1252')
Am fost în căutarea pentru a rezolva următorul mesaj de eroare:
unicodedecodeerror: 'ascii' codec poate't decode octet 0xe2 în poziția 5454: ordinal nu este în gama(128)
În cele din urmă am luat-o fix prin specificarea 'codare':
f = open('../glove/glove.6B.100d.txt', encoding="utf-8")
Vrea să te ajute.
"UnicodeDecodeError: 'ascii' codec can't decode byte"
Cauza acestei erori: input_string trebuie să fie unicode dar str fost dat
"TypeError: Decoding Unicode is not supported"
Cauza această eroare: încercarea de a converti unicode input_string în unicode
Așa că verificați mai întâi că input_string este str
și de a converti la unicode, dacă este necesar:
if isinstance(input_string, str):
input_string = unicode(input_string, 'utf-8')
În al doilea rând, cele de mai sus doar modificări de tipul, dar nu elimina caractere non ascii. Dacă doriți să eliminați caractere non-ascii:
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')
Cred că cel mai bun este de a converti întotdeauna să unicode - dar acest lucru este dificil de realizat deoarece, în practică, ai'de a verifica și de a converti fiecare argument pentru fiecare funcție și metodă-ai scris, care include o formă de șir de prelucrare.
Așa că am venit cu următoarea abordare să fie de garantare unicodes sau siruri de caractere octet, fie de intrare. Pe scurt, a a include și de a folosi următoarele lambda:
# 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)
Exemple:
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))
Aici's ceva mai mult raționament despre asta.
Codifica convertește un unicode obiect la un obiect string. Cred că sunteți încercarea de a codifica un obiect string. primul a converti rezultatul în unicode obiect și apoi codifica că unicode obiect în 'utf-8'. de exemplu
result = yourFunction()
result.decode().encode('utf-8')
În scopul de a rezolva acest lucru pe un sistem de operare de nivel într-o instalare Ubuntu verificați următoarele: `shell $ locale charmap ``
Dacă tu a lua
localizare: nu se Poate seta LC_CTYPE să implicită: Nu există un astfel de fișier sau director
în loc de
UTF-8
apoi LC_CTYPE " și " LC_ALLastfel:
shell
$ export LC_ALL="en_US.UTF-8"
$ export LC_CTYPE="en_US.UTF-8"
``
Am avut aceeasi problema dar am't de lucru pentru Python 3. L-am urmat si mi-a rezolvat problema:
enc = sys.getdefaultencoding()
file = open(menu, "r", encoding = enc)
Trebuie să setați criptarea atunci când sunteți de lectură/scriere în fișier.
Are un fel de eroare și acest lucru mi-a rezolvat eroarea. Multumesc!!! python 2 și 3 python diferite în unicode manipulare este de a face murat fișiere destul de incompatibil cu sarcina. Deci, Utilizarea python marinate's codare argument. Link-ul de mai jos m-a ajutat a rezolva problema asemanatoare cand am fost încercarea de a deschide murat date în python 3.7, în timp ce dosarul meu a fost salvat inițial în python 2.versiune x. https://blog.modest-destiny.com/posts/python-2-and-3-compatible-pickle-save-and-load/ Am copia load_pickle funcție în script-ul meu și a chemat load_pickle(pickle_file) în timp ce de încărcare mea input_data astfel:
input_data = load_pickle("my_dataset.pkl")
La load_pickle funcție este aici:
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
Pe scurt, pentru a asigura buna unicode manipulare în Python 2:
print(text.codifica('ascii', 'înlocuiți').decode())
Pentru explicații, a se vedea @Alastair McCormack's răspuns detaliat.
Am avut aceeasi eroare, cu Url-uri care conțin non-ascii caractere (octeți cu valori > 128), soluția mea:
url = url.decode('utf8').encode('utf-8')
Notă: utf-8, utf-8 sunt pur și simplu false . Folosind doar 'utf8' sau 'utf-8' ar trebui să funcționeze în același mod
În cazul meu, a lucrat pentru mine, în Python 2.7, cred că această misiune s-a schimbat 'ceva' în str
reprezentare internă--de exemplu, forțele de dreptul de decodare a susținut secvență de octeți în url
și în cele din urmă pune șir într-un utf-8 str
cu toate magia în locul potrivit.
Unicode în Python este magie neagră pentru mine.
Sperăm util
Această eroare apare atunci când există unele caractere non ASCII în șir noastră și suntem de a efectua orice operațiuni pe care șir fără o decodare. Acest lucru m-a ajutat a rezolva problema mea. Am citit un fișier CSV cu coloane ID-ul,Text și decodare caractere în ea ca mai jos:
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)
Într-o Django (1.9.10)/Python 2.7.5 proiect am dese UnicodeDecodeError` excepții; în principal atunci când am încerca să se hrănească siruri de caractere unicode la logare. Am făcut o funcția de helper pentru obiecte arbitrare practic format la 8-bit ascii siruri de caractere și de a înlocui orice caractere care nu sunt în tabelul de la '?'. Cred că's nu cea mai bună soluție, dar din moment ce codificare implicită este ascii (și eu nu't doriți să-l schimbe) se va face:
def encode_for_logging(c, encoding='ascii'): dacă isinstance(c, basestring): întoarcerea c.codarea(codificarea, 'înlocuiți') elif isinstance(c, Iterable): c_ = [] pentru v în c: c_.append(encode_for_logging(v, codificare)) reveni c_ altceva: reveni encode_for_logging(unicode(c))`
Aici este soluția mea, trebuie doar să adăugați la codificarea. cu open(fișier, encoding='utf8'), ca f`
Și pentru că lectura mănușă fișier va lua o lungă perioadă de timp, vă recomandăm să manusa fișier la un numpy fișier. Când netx timp ai citit încorporarea greutăți, se va economisi timp.
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)
Esența link-ul: https://gist.github.com/BrambleXu/634a844cdd3cd04bb2e3ba3c83aef227