2011-06-13 22 views
13

Recibo este error y no sé lo que significa. ¿Como puedo solucionar este problema?error de decapado en python?

mi código es el siguiente, lo he usado antes y que ha trabajado:

parentdir = os.getcwd() 
dirlist = os.listdir(parentdir) 

for dir in dirlist: 
    if not dir == "pubs_edits": continue 
    if os.path.isdir(os.path.join(parentdir, dir)): 
         os.chdir(os.path.join(parentdir, dir)) 
         file_list = os.listdir(os.path.join(parentdir, dir)) 
         for f in file_list: 
          in1 = open(f, 'r') 
          dict2 = pickle.load(in1) 

Este es el mensaje de error:

File "/home/md202/pmid_editor.py", line 18, in <module> 
     dict2 = pickle.load(in1) 
    File "/usr/lib/python2.5/pickle.py", line 1370, in load 
     return Unpickler(file).load() 
    File "/usr/lib/python2.5/pickle.py", line 858, in load 
     dispatch[key](self) 
KeyError: '\x00' 
+2

Talentos completos por favor .... ¿es este tu código? Cómo reproducirse? –

+0

¿Qué estás deshaciendo? Si es una instancia de una clase que definió, ¿ha importado la clase? –

+0

Estoy deshaciendo el diccionario que seleccioné en un archivo. – marsx

Respuesta

-1

tal vez debería probar con otro protocolo de tratar pickle.load(in1, 2)!

+0

¿Qué significa esto? – marsx

+0

Eche un vistazo a la documentación del módulo [enlace] (http://docs.python.org/library/pickle.html#data-stream- format), la función de carga toma un parámetro opcional que define cómo se decaparán los datos. – Chakib

+2

Según el documento, load() no toma ningún parámetro opcional, solo dump does. – a1an

13

Este error se produjo exacta para mí cuando traté de unpickle (usando pickle.loads) una representación de cadena que había almacenado en una base de datos a través de Django. Django cambió la representación de caracteres de mi cadena para que pickle.loads(mystring) me arrojara ese error. Cuando agregué una conversión de cadena explícita, estaba bien: pickle.loads(str(mystring))

EDITAR: mirando los comentarios en la publicación original, creo que esto está relacionado con el problema de cadena unicode mencionado. Puse una cadena normal en la base de datos, y django me devuelve una cadena Unicode que produce este error.

+0

Tu respuesta me ayudó con mi problema. Yo estaba usando el motor de aplicaciones y había almacenado la cadena en escabeche como db.Text (a) Propiedad cuando debería haber utilizado db.Blob() –

+0

Gracias Matt, tengo el error exacto lo que ha especificado traté de guardarlo en db usando Django y obtienes este error mientras deshaces el objeto. – Anto

+0

presumiblemente este error no ocurriría en Python 3+? – Demis

3

tuve un problema similar, lo que resulta en KeyError: '\x1f'.

En mi caso, si fue escaneada a un archivo gzip (es decir, gzip.open(fileName,'wb')), y estaba tratando de leerlo con un objeto de archivo normal (es decir: open(fileName,'rb')).

+0

Parece que los archivos en escabeche juegan complicado con gzip. Mi archivo encurtido parecía un gzip (según 'archivo') pero cuando intenté dispararlo, devolvía un pequeño archivo (de 200M a 10K) sin datos útiles (pickle.load da el mismo KeyError: '\ x00' problema con un archivo descomprimido. – a1an

+0

parece que el archivo está incompleto o dañado. Si fue encurtido en un formato de texto, podría echar un vistazo a 'zcat myfile' - ¿parece razonable? – drevicko

+0

Probablemente fue corrompido, traté de regenerarlo y no tuve más errores al cargar – a1an

-1

me he encontrado con el mismo problema cuando yo estaba tratando de automatizar los datos que pueblan en Django. El problema es que pueden existir algunos archivos ocultos que no sean pkl, como '.DS_Store'. Por lo tanto, si este es el caso, puede manejar este problema agregando filtro de expresiones regulares antes de cargar por lo que acaba de obtener los archivos de PKL '':

import re 

for dir in dirlist: 
    if not dir == "pubs_edits": continue 
    if os.path.isdir(os.path.join(parentdir, dir)): 
     os.chdir(os.path.join(parentdir, dir)) 
     file_list = os.listdir(os.path.join(parentdir, dir)) 
     reg = re.compile(r'pkl') 
     for f in file_list: 
      if reg.search(f): 
       in1 = open(f, 'r') 
       dict2 = pickle.load(in1) 
0

la salmuera es binaria lo que tiene que leerlo como tal. En lugar de ('r') intente usar ('rb') leer binario. Además, si escribe el archivo, asegúrese de escribir también el archivo pickle como binario ('wb'). Eso debería funcionar, espero que ayude.

+0

no sé por qué estás degradado, esta es la respuesta que estaba buscando. ¡Un error fácil de hacer! – user2677280

Cuestiones relacionadas