2015-11-22 19 views
5

a special version for python içeren CIFAR-10 dataset ile çalışıyorum çalışıyorum.Python3 turle ile python2 cPikle tarafından seri hale getirilmiş veriler nasıl okunur?

Her biri 10k numpy matrislerinin bir sözlüğünü temsil eden bir ikili dosyalar dizisidir. Dosyalar açık bir şekilde python2 cPickle tarafından yaratılmıştır. Bu gerçekten harika işler

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

:

ben şöyle python2 onu yüklemeye çalıştı. Ben python3 veri yüklemek için çalışırsanız, ancak (yerine değil cPickle ama pickle vardır), başarısız:

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

aşağıdaki hata ile başarısız olursa:

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

ben bir şekilde dönüşümü Can python3'ten okunabilecek yeni bir veri kümesine 3? Ya da bir şekilde python3'ten okuyabilir miyim?

Ben cPickle tarafından yüklemeden json içine damping ve pickle tarafından geri okuma denedim ama numpy matrisler belli ki json dosyası olarak yazılamaz.

cevap

5

Bu bytestring'ler için hangi codec bileşeninin kullanılacağını belirtebilir ya da verileri bunun yerine bytes olarak yüklemesini söyleyin. Gönderen pickle.load() documentation: Sadece google üzerinden bu bulmak diğerleri için

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

:

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.

olurdu bytes nesneler olarak dizeleri yüklemek için bu düzeltmeyi uygularsanız, daha sonra bir ileti 'almak TypeError : Unicode karakteri, bayt değil, numpy sürümünüz çok eski ve [this] (https://github.com/numpy/numpy/issues/4879) hataya sahip olmalıdır. –

+0

belki de latin1 ve byte değil –

+0

@ShimonDoodkin'i kullanmak daha iyidir: bu tamamen verilere bağlı olacaktır. Ve sadece Latin-1'in her zaman işe yaradığı için aslında Latince-1 verisi olduğu anlamına gelmez. –

İlgili konular