Cómo solucionarlo: "UnicodeDecodeError: el códec 'ascii' no puede decodificar el byte"

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!

¿Como arreglarlo?

En algunas otras aplicaciones de blog estáticas basadas en Python, las publicaciones chinas se pueden publicar con éxito. Como esta aplicación: http://github.com/vrypan/bucket3 . En mi sitio http://bc3.brite.biz/ , la publicación en chino se puede publicar con éxito.

pescador
fuente

Respuestas:

569

tl; dr / solución rápida

  • No decodifique / codifique willy nilly
  • No asuma que sus cadenas están codificadas en UTF-8
  • Intente convertir cadenas en cadenas Unicode lo antes posible en su código
  • Repara tu configuración regional: ¿Cómo resolver UnicodeDecodeError en Python 3.6?
  • No caigas en la tentación de usar reloadhacks rápidos

Unicode Zen en Python 2.x - La versión larga

Sin ver la fuente, es difícil conocer la causa raíz, por lo que tendré que hablar en general.

UnicodeDecodeError: 'ascii' codec can't decode bytegeneralmente ocurre cuando intenta convertir un Python 2.x strque contiene no ASCII a una cadena Unicode sin especificar la codificación de la cadena original.

En resumen, las cadenas Unicode son un tipo completamente separado de cadena Python que no contiene ninguna codificación. Solo contienen códigos de punto Unicode y, por lo tanto, pueden contener cualquier punto Unicode de todo el espectro. Las cadenas contienen texto codificado, como UTF-8, UTF-16, ISO-8895-1, GBK, Big5, etc. Las cadenas se decodifican en Unicode y los Unicodes se codifican en cadenas . Los archivos y los datos de texto siempre se transfieren en cadenas codificadas.

Los autores del módulo Markdown probablemente usan unicode()(donde se lanza la excepción) como una puerta de calidad para el resto del código: convertirá ASCII o volverá a envolver las cadenas Unicodes existentes en una nueva cadena Unicode. Los autores de Markdown no pueden conocer la codificación de la cadena entrante, por lo que confiarán en usted para decodificar cadenas en cadenas Unicode antes de pasar a Markdown.

Las cadenas Unicode se pueden declarar en su código utilizando el uprefijo a las cadenas. P.ej

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

Las cadenas Unicode también pueden provenir de archivos, bases de datos y módulos de red. Cuando esto sucede, no necesita preocuparse por la codificación.

Gotchas

La conversión de stra Unicode puede ocurrir incluso cuando no llama explícitamente unicode().

Los siguientes escenarios causan UnicodeDecodeErrorexcepciones:

# 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: ' + '€'         

Ejemplos

En el siguiente diagrama, puede ver cómo cafése ha codificado la palabra en codificación "UTF-8" o "Cp1252" dependiendo del tipo de terminal. En ambos ejemplos, cafes solo ascii regular. En UTF-8, ése codifica utilizando dos bytes. En "Cp1252", é es 0xE9 (que también es el valor del punto Unicode (no es coincidencia)). Se decode()invoca lo correcto y la conversión a Python Unicode es exitosa: Diagrama de una cadena que se convierte en una cadena Python Unicode

En este diagrama, decode()se llama con ascii(que es lo mismo que llamar unicode()sin una codificación dada). Como ASCII no puede contener bytes mayores que 0x7F, esto arrojará una UnicodeDecodeErrorexcepción:

Diagrama de una cadena que se convierte en una cadena Python Unicode con la codificación incorrecta

El sandwich de Unicode

Es una buena práctica formar un sándwich Unicode en su código, donde decodifica todos los datos entrantes en cadenas Unicode, trabaja con Unicodes y luego codifica a strs al salir. Esto evita que se preocupe por la codificación de cadenas en el medio de su código.

Entrada / Decodificación

Código fuente

Si necesita hornear no ASCII en su código fuente, simplemente cree cadenas Unicode prefijando la cadena con un u. P.ej

u'Zürich'

Para permitir que Python decodifique su código fuente, deberá agregar un encabezado de codificación para que coincida con la codificación real de su archivo. Por ejemplo, si su archivo fue codificado como 'UTF-8', usaría:

# encoding: utf-8

Esto solo es necesario cuando tienes no ASCII en tu código fuente .

Archivos

Por lo general, los datos no ASCII se reciben de un archivo. El iomódulo proporciona un TextWrapper que decodifica su archivo sobre la marcha, utilizando un determinado encoding. Debe usar la codificación correcta para el archivo; no se puede adivinar fácilmente. Por ejemplo, para un archivo UTF-8:

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

my_unicode_stringentonces sería adecuado para pasar a Markdown. Si es UnicodeDecodeErrorde la read()línea, entonces probablemente haya usado el valor de codificación incorrecto.

Archivos CSV

El módulo CSV Python 2.7 no admite caracteres que no sean ASCII 😩. Sin embargo, hay ayuda disponible con https://pypi.python.org/pypi/backports.csv .

Úselo como se indica arriba, pero pásele el archivo abierto:

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

Bases de datos

La mayoría de los controladores de bases de datos de Python pueden devolver datos en Unicode, pero generalmente requieren una pequeña configuración. Utilice siempre cadenas Unicode para consultas SQL.

MySQL

En la cadena de conexión agregue:

charset='utf8',
use_unicode=True

P.ej

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

Añadir:

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

HTTP

Las páginas web se pueden codificar en casi cualquier codificación. El Content-typeencabezado debe contener un charsetcampo para indicar la codificación. El contenido se puede decodificar manualmente contra este valor. Alternativamente, Python-Requests devuelve Unicodes en response.text.

A mano

Si debe decodificar cadenas manualmente, simplemente puede hacer my_string.decode(encoding), donde encodingestá la codificación adecuada. Los códecs compatibles con Python 2.x se proporcionan aquí: Codificaciones estándar . De nuevo, si obtienes, UnicodeDecodeErrorentonces probablemente tienes la codificación incorrecta.

La carne del sandwich

Trabaja con Unicodes como lo harías con strs normales.

Salida

stdout / impresión

printescribe a través de la secuencia estándar. Python intenta configurar un codificador en stdout para que los Unicodes se codifiquen con la codificación de la consola. Por ejemplo, si un shell de Linux localees en_GB.UTF-8, la salida se codificará en UTF-8. En Windows, estará limitado a una página de códigos de 8 bits.

Una consola configurada incorrectamente, como una configuración regional corrupta, puede provocar errores de impresión inesperados. PYTHONIOENCODINGLa variable de entorno puede forzar la codificación para stdout.

Archivos

Al igual que la entrada, io.opense puede usar para convertir de manera transparente Unicodes en cadenas de bytes codificadas.

Base de datos

La misma configuración para la lectura permitirá que los Unicodes se escriban directamente.

Python 3

Python 3 no es más capaz de Unicode que Python 2.x, sin embargo, está un poco menos confundido sobre el tema. Por ejemplo, el regular strahora es una cadena Unicode y el antiguo strahora bytes.

La codificación predeterminada es UTF-8, por lo que si .decode()usa una cadena de bytes sin proporcionar una codificación, Python 3 usa la codificación UTF-8. Esto probablemente soluciona el 50% de los problemas Unicode de las personas.

Además, open()opera en modo de texto por defecto, por lo que devuelve decodificado str(Unicode). La codificación se deriva de su configuración regional, que tiende a ser UTF-8 en sistemas Un * x o una página de códigos de 8 bits, como windows-1251, en cuadros de Windows.

Por qué no deberías usar sys.setdefaultencoding('utf8')

Es un truco desagradable (hay una razón que debe usar reload) que solo enmascarará problemas y dificultará su migración a Python 3.x. Comprenda el problema, solucione la causa raíz y disfrute del zen Unicode. Consulte ¿Por qué NO deberíamos usar sys.setdefaultencoding ("utf-8") en un script py? para mas detalles

Alastair McCormack
fuente
2
Para alguien que busca respuestas de Python 2, un TLDR más útil: usar io.openpara leer / escribir archivos, usar from __future__ import unicode_literals, configurar otras entradas / salidas de datos (por ejemplo, bases de datos) para usar Unicode.
idbrii
Entonces, ¿cómo lo arreglamos? lol esto no es un problema de escribir un Script que es de la instalación de uno
Mateo
@Matthew prueba de configuración PYTHONIOENCODING=utf-8. Si eso no lo soluciona, deberá comunicarse con el autor del script para corregir su código.
Alastair McCormack
498

Finalmente lo tengo:

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

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

Dejame revisar:

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'
>>>

Lo anterior muestra que la codificación predeterminada de python es utf8. Entonces el error ya no existe.

pescador
fuente
77
Intento esto, pero no pudo cambiar la codificación de forma permanente. Una vez que salga de la consola de Python y comience de nuevo, la codificación sigue siendo la misma
macemers
37
¡Gracias! Pero, ¿por qué necesitamos recargar sys después de importarlo?
Dmiters
66
@DmitryNarkevich, debido a la función Illusive setdefaultencoding . Se elimina al inicio de Python ya que, en primer lugar, nunca debería haber sido parte de un lanzamiento adecuado, al parecer.
antes del
3
Significa que no ha solucionado la causa raíz. Acaba de reparar cualquier conversión implícita
Alastair McCormack
55
La codificación predeterminada de @miraculixx Python 3 es UTF-8 con cadenas Unicode como predeterminadas str, por lo que no está atrasado allí. En Python 2.x, Unicode estaba en un estado de transición, por lo que habría sido peligroso asumir una codificación al convertir bytes a Unicodes. Por lo tanto, la codificación predeterminada de Py2 de ASCII fue una elección deliberada y por qué cambiar la codificación predeterminada requiere el truco deliberado de la recarga sys. La forma correcta de desterrar los errores de codificación en Py2 es decodificar y codificar de forma inequívoca (byte) cadenas en Unicode, cuando las conversiones son necesarias, no solo asumir que las cadenas están codificadas en UTF-8.
Alastair McCormack
130

Este es el clásico "problema unicode". Creo que explicar esto está más allá del alcance de una respuesta de StackOverflow para explicar completamente lo que está sucediendo.

Está bien explicado aquí .

En un resumen muy breve, ha pasado algo que se interpreta como una cadena de bytes a algo que necesita decodificarlo en caracteres Unicode, pero el códec predeterminado (ascii) falla.

La presentación que te señalé proporciona consejos para evitar esto. Convierta su código en un "sandwich unicode". En Python 2, el uso de from __future__ import unicode_literalsayudas.

Actualización: cómo se puede arreglar el código:

OK - en tu variable "fuente" tienes algunos bytes. No está claro por su pregunta cómo llegaron allí, ¿tal vez los leyó de un formulario web? En cualquier caso, no están codificados con ascii, pero python está tratando de convertirlos a unicode suponiendo que lo estén. Necesita decirle explícitamente cuál es la codificación. ¡Esto significa que necesita saber cuál es la codificación! Eso no siempre es fácil, y depende completamente de dónde vino esta cadena. Podría experimentar con algunas codificaciones comunes, por ejemplo, UTF-8. Le dice a unicode () la codificación como un segundo parámetro:

source = unicode(source, 'utf-8')
GreenAsJade
fuente
1
sigue siendo un dolor de cabeza, señor GreenAsJade, ¿puede darme una solución concreta?
pescador
1
¿Estás preguntando "cómo puedo, como usuario de este blog, evitar este problema?". ¿O es su pregunta "cómo puedo arreglar el código para que este problema no ocurra"?
GreenAsJade
2
Sr. greenasjade: ¿dónde debo poner "source = unicode (source, 'utf-8')"?
pescador
77
Extraño ... después de comentarios positivos durante más de un año, de repente dos votos negativos ... ¿Eh?
GreenAsJade
11
use currentFile = open(filename, 'rt', encoding='latin1')o currentFile = open(filename, 'rt', encoding='utf-8')- vea aquí: stackoverflow.com/a/23917799/2047442
irudyak el
42

En algunos casos, cuando verifica su codificación predeterminada ( print sys.getdefaultencoding()), devuelve que está utilizando ASCII. Si cambia a UTF-8, no funciona, dependiendo del contenido de su variable. Encontré otra forma:

import sys
reload(sys)  
sys.setdefaultencoding('Cp1252')
Davy
fuente
Ty, esto funcionó para mi problema con Python lanzando UnicodeDecodeError en var = u "" "variar cadena grande" ""
user2426679
AttributeError: el módulo 'sys' no tiene el atributo 'setdefaultencoding'
Chaine
y reload(sys)se usa por esa razón en particular.
Marcin Orlowski el
1
Trabajó para mi ! GRACIAS !
Maciej
22

Estaba buscando resolver el siguiente mensaje de error:

unicodedecodeerror: el códec 'ascii' no puede decodificar el byte 0xe2 en la posición 5454: el ordinal no está en el rango (128)

Finalmente lo solucioné especificando 'codificación':

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

Ojalá pudiera ayudarte también.

Zoe L
fuente
esto resolvió el error para mí al leer / escribir archivos .csv, no necesitaba ninguna de las otras cosas enumeradas en las otras respuestas
usuario5359531
No entiendo por qué las otras respuestas proporcionan tantos detalles ... pero olvídate de esta solución simple. +10!
stan0
18
"UnicodeDecodeError: 'ascii' codec can't decode byte"

Causa de este error: input_string debe ser unicode pero se le dio str

"TypeError: Decoding Unicode is not supported"

Causa de este error: tratando de convertir unicode input_string en unicode


Entonces, primero verifique que su input_string sea stry conviértalo a unicode si es necesario:

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

En segundo lugar, lo anterior solo cambia el tipo pero no elimina los caracteres que no son ascii. Si desea eliminar caracteres que no sean 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')
Aishwarya Subramanian
fuente
9

Creo que lo mejor es convertir siempre a Unicode, pero esto es difícil de lograr porque en la práctica tendrías que verificar y convertir cada argumento a cada función y método que escribas que incluya alguna forma de procesamiento de cadenas.

Así que se me ocurrió el siguiente enfoque para garantizar cadenas unicodes o de bytes, desde cualquier entrada. En resumen, incluya y use las siguientes lambdas:

# 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)

Ejemplos:

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))

Aquí hay más razonamientos sobre esto .

miraculixx
fuente
Hola, en Python 3 la función _u no funciona con este valor 'Ita £'.
Martin
1
Ok, ¿por dónde empezar con tu "razonamiento"? print unicode(u'Zürich', encoding="UTF-8")y luego se queja "Pero sorprendentemente no puede codificar unicode ext en UTF8". unicode()no codifica; decodifica y no puedes decodificar un Unicode, ¡ya está decodificado!
Alastair McCormack
@AlastairMcCormack Eres bienvenido a mejorar la publicación. Sin embargo, si prefiere esparcir su supuesta superioridad sobre todos los demás que no comparten su opinión y visión, francamente no estoy interesado. Gracias.
miraculixx
3
@miraculixx Lo siento, no quise parecer un idiota. Preocuparse por decodificar y codificar cada vez que use una cadena en su código es simplemente innecesario.
Alastair McCormack
7

Para resolver esto a nivel de sistema operativo en una instalación de Ubuntu, verifique lo siguiente:

$ locale charmap

Si lo consigues

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

en vez de

UTF-8

luego establece LC_CTYPEy LC_ALLasí:

$ export LC_ALL="en_US.UTF-8"
$ export LC_CTYPE="en_US.UTF-8"
vervas
fuente
6

Codificar convierte un objeto Unicode en un objeto de cadena. Creo que estás intentando codificar un objeto de cadena. primero convierta su resultado en objeto unicode y luego codifique ese objeto unicode en 'utf-8'. por ejemplo

    result = yourFunction()
    result.decode().encode('utf-8')
RAFI AFRIDI
fuente
4

Tuve el mismo problema pero no funcionó para Python 3. Seguí esto y resolvió mi problema:

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

Debe configurar la codificación cuando está leyendo / escribiendo el archivo.

Reihan_amn
fuente
4

Obtuve el mismo error y esto resolvió mi error. ¡Gracias! Python 2 y Python 3 que difieren en el manejo Unicode están haciendo que los archivos encurtidos sean bastante incompatibles para cargar. Entonces use el argumento de codificación de python pickle. El enlace a continuación me ayudó a resolver un problema similar cuando intentaba abrir datos encurtidos de mi python 3.7, mientras que mi archivo se guardó originalmente en la versión python 2.x. https://blog.modest-destiny.com/posts/python-2-and-3-compatible-pickle-save-and-load/ Copié la función load_pickle en mi script y llamé load_pickle (pickle_file) mientras cargaba mi input_data así:

input_data = load_pickle("my_dataset.pkl")

La función load_pickle está aquí:

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
Ganesh Shah
fuente
1
Es mejor incluir la definición de load_picklefunción en su respuesta.
sanyash
4

Esto funcionó para mí:

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

En resumen, para garantizar el manejo adecuado de Unicode en Python 2:

  • utilizar io.openpara leer / escribir archivos
  • utilizar from __future__ import unicode_literals
  • configurar otras entradas / salidas de datos (p. ej., bases de datos, red) para usar unicode
  • si no puede configurar salidas a utf-8, convierta su salida para ellas print(text.encode('ascii', 'replace').decode())

Para explicaciones, consulte la respuesta detallada de @Alastair McCormack .

idbrii
fuente
• se usa io.open(path, 'r', encoding='utf-8')para leer archivos codificados con utf-8.
Bob Stein
3

Tuve el mismo error, con URL que contienen caracteres no ascii (bytes con valores> 128), mi solución:

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

Nota: utf-8, utf8 son simplemente alias. Usar solo 'utf8' o 'utf-8' debería funcionar de la misma manera

En mi caso, funcionó para mí, en Python 2.7, supongo que esta asignación cambió 'algo' en la strrepresentación interna, es decir, fuerza la decodificación correcta de la secuencia de bytes respaldada urly finalmente coloca la cadena en un utf-8 str con Toda la magia en el lugar correcto. Unicode en Python es magia negra para mí. Espero útil

Fabiano Tarlao
fuente
1
¿Por qué una carrera en uno y no en el otro
IgorGanapolsky
1
Python acepta alias para codificar nombres, lo he intentado ahora y he realizado lo mismo ... simplemente no me he dado cuenta de que los escribí de manera diferente, agregó la nota
Fabiano Tarlao
2

Tuve el mismo problema con la cadena "Pastelería Mallorca" y resolví con:

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

En un proyecto Django (1.9.10) / Python 2.7.5 tengo UnicodeDecodeErrorexcepciones frecuentes ; principalmente cuando intento alimentar cadenas unicode al registro. Hice una función auxiliar para que los objetos arbitrarios se formateen básicamente en cadenas ascii de 8 bits y reemplace cualquier carácter que no esté en la tabla a '?'. Creo que no es la mejor solución, pero como la codificación predeterminada es ascii (y no quiero cambiarla) lo hará:

def encode_for_logging (c, codificación = 'ascii'):
    if isinstance (c, basetring):
        return c.encode (codificación, 'reemplazar')
    elif isinstance (c, Iterable):
        c_ = []
        para v en c:
            c_.append (encode_for_logging (v, codificación))
        volver c_
    más:
        return encode_for_logging (unicode (c))
``

Paul Bormans
fuente
1

Este error ocurre cuando hay algunos caracteres no ASCII en nuestra cadena y estamos realizando cualquier operación en esa cadena sin la decodificación adecuada. Esto me ayudó a resolver mi problema. Estoy leyendo un archivo CSV con ID de columnas, texto y caracteres de decodificación como se muestra a continuación:

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)
Sravya
fuente
0

Aquí está mi solución, solo agregue la codificación. with open(file, encoding='utf8') as f

Y debido a que leer el archivo de guantes llevará mucho tiempo, recomiendo el archivo de guantes a un archivo numpy. Cuando netx time lea los pesos de incrustación, le ahorrará tiempo.

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) 

Enlace general: https://gist.github.com/BrambleXu/634a844cdd3cd04bb2e3ba3c83aef227

Zarza
fuente
0

Especifique: # encoding = utf-8 en la parte superior de su archivo Python, debería solucionar el problema

Sameer Kumar Choudhary
fuente