Puedo usar python 3.4 con win 7 de 64 bits del sistema. Me encontré con el siguiente código:

      6   """ load single batch of cifar """
      7   with open(filename, 'r') as f:
----> 8     datadict = pickle.load(f)
      9     X = datadict['data']

El mensaje equivocado es UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 0: illegal multibyte sequence

He cambiado la línea 7 como:

      6   """ load single batch of cifar """
      7   with open(filename, 'r'encoding='utf-8') as f:
----> 8     datadict = pickle.load(f)
      9     X = datadict['data']

El mensaje equivocado convirtió en UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte.

El mensaje finalmente señala a la Python34\lib\codecs.py en decodificar(self, de entrada, final).

    311         # decode input (taking the buffer into account)
    312         data = self.buffer + input
--> 313         (result, consumed) = self._buffer_decode(data, self.errors, final)
    314         # keep undecoded input until the next call
    315         self.buffer = data[consumed:]

Además tengo cambiado el código como:

      6 """ load single batch of cifar """ 
      7 with open(filename, 'rb') as f:
----> 8 datadict = pickle.load(f) 
      9 X = datadict['data'] 10 Y = datadict['labels']

Bueno, esta vez es UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 6: ordinal not in range(128).

¿Cuál es el problema y cómo resolverlo?

  • ¿Cuál es la completa trazabilidad de la última versión? El pickle documentación indica que el archivo objeto debe devolver bytes, por lo que tener para abrir el objeto de archivo en modo binario con 'rb', pero ahora tiene un nuevo error. ¿Cómo fue el pepinillo archivo creado en el primer lugar?
  • importación de encurtidos como pepinillos import numpy como np importación os def load_CIFAR_batch(nombre de archivo): «»» carga de lote único de cifar «»» con open(filename, ‘rb’) como f: datadict = pickle.de carga(f) Esto es como el pepinillo es creado.
  • Puede editar tu post para añadir más información.
  • Ustedes me están diciendo cómo la salmuera se carga, no a la forma en que fue escrito.
  • la salmuera es el estándar módulo de python. Yo no la toque.
  • No, me estoy preguntando cómo se creó el archivo. Alguien ha usado pickle.dump() o pickle.dumps() para producir pickle de datos. Me gustaría ver cómo el archivo de salida que usted está tratando de carga que se producen.
  • el archivo se ha descargado desde cs.toronto.edu/~kriz/cifar.html. Parece que los archivos son producidos por cPickle por el Python 2.X. Sin embargo, yo uso Python 3.4, en el que cPickle y pepinillos están fusionadas. ¿Quiere esto decir que no se queda atrás compatible?
  • Voy a echar un vistazo; peor de los casos que datos necesitan ser convertidos primero, pero creo que puede conseguir lejos con usar un especificador de protocolo. No está seguro de cuándo puedo descargar el fichero (el viaje en tren hace que la descarga de un poco más difícil).

InformationsquelleAutor Haoyu | 2015-01-27

2 Comentarios

  1. 10

    Pickle archivos son archivos de datos binarios, por lo que siempre hay que abrir el archivo con el 'rb' modo cuando se carga. No intente utilizar el modo texto aquí.

    Usted está tratando de cargar un Python 2 de la salmuera que contiene datos de cadena. Tendrás que decirle a pickle.load() cómo convertir los datos en Python 3 cadenas, o dejarlos como bytes.

    El valor predeterminado es intentar decodificar esas cadenas de caracteres ASCII, y que la decodificación se produce un error. Ver el pickle.load() documentación:

    Palabra clave opcional argumentos son fix_imports, codificación y errores, que se utilizan para el control de la compatibilidad de apoyo para pickle flujo generado por Python 2. Si fix_imports es cierto, pepinillo intentará mapa de la antigua Python 2 los nombres de los nuevos nombres que se utilizan en Python 3. El codificación y errores decir pickle cómo decodificar 8-bits de la cadena de instancias de vinagre por Python 2; por defecto a ‘ASCII’ y ‘estricto’, respectivamente. El codificación puede ser ‘bytes’ para leer estos 8 bits de la cadena de instancias como el número de bytes de los objetos.

    Configuración de la codificación a latin1 permite importar los datos directamente:

    with open(filename, 'rb') as f:
        datadict = pickle.load(f, encoding='latin1') 

    Parece que es el numpy de la matriz de datos que está causando los problemas aquí como todas las cadenas en el uso del conjunto de caracteres ASCII sólo.

    La alternativa sería el uso de encoding='bytes' pero entonces todos los nombres de archivo de nivel superior y de las claves de diccionario son bytes objetos y tenemos que decodificar esos o prefijo de su clave literales con b.

  2. 1

    si usted va a abrir el archivo con codificación utf-8,entonces usted necesita escribir:
    open(nombre_archivo, «r», encoding=’UTF-8′)
    si usted va a abrir el archivo con JDS,entonces usted necesita hacer:
    open(nombre_archivo, ‘rb’)
    esperanza para resolver su problema!

Dejar respuesta

Please enter your comment!
Please enter your name here