2015-11-22 15 views
5

Sto provando a lavorare con CIFAR-10 dataset che contiene a special version for python.Come leggere i dati serializzati da python2 cPikle con python3 pickle?

Si tratta di un insieme di file binari, ognuno dei quali rappresenta un dizionario di matrici di 10 caratteri. I file sono stati ovviamente creati da python2 cPickle.

ho cercato di caricarlo da python2 come segue:

import cPickle 
with open("data/data_batch_1", "rb") as f: 
    data = cPickle.load(f) 

Questo funziona davvero grande. Tuttavia, se provo a caricare i dati da python3 (non cPickle ma pickle ha invece), viene a mancare:

import pickle 
with open("data/data_batch_1", "rb") as f: 
    data = pickle.load(f) 

Se non riesce con il seguente errore:

UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 6: ordinal not in range(128) 

Posso in qualche modo trasformare il dataset originale in uno nuovo che sarà leggibile da python3? O posso in qualche modo leggerlo direttamente da python3?

Ho provato a caricarlo da cPickle, lo scarico in json e la lettura indietro di pickle, ma matrici NumPy, ovviamente, non può essere scritto in un file JSON.

risposta

5

Avrete bisogno di dire sottaceti quale codec utilizzare per questi ultimi, oppure di caricare i dati come bytes. Dal pickle.load() documentation:

The encoding and errors tell pickle how to decode 8-bit string instances pickled by Python 2; these default to ‘ASCII’ and ‘strict’, respectively. The encoding can be ‘bytes’ to read these 8-bit string instances as bytes objects.

Per caricare le stringhe come bytes oggetti che sarei:

import pickle 
with open("data/data_batch_1", "rb") as f: 
    data = pickle.load(f, encoding='bytes') 
+1

Proprio per gli altri che trovano questo tramite Google: se si applica questa correzione, quindi ottenere un messaggio 'TypeError : deve essere un carattere unicode, non byte, la tua versione numpy è troppo vecchia e ha [bug] (https://github.com/numpy/numpy/issues/4879). –

+0

forse meglio usare latin1 e non i byte –

+0

@ShimonDoodkin: ciò dipenderebbe interamente dai dati. E solo perché Latin-1 funziona sempre non significa che tu abbia effettivamente dati Latin-1. –

Problemi correlati