2015-11-22 4 views
5

मैं CIFAR-10 dataset के साथ काम करने की कोशिश कर रहा हूं जिसमें a special version for python शामिल है।python3 पिकल के साथ python2 cpikle द्वारा धारावाहिक डेटा को कैसे पढ़ा जाए?

यह बाइनरी फाइलों का एक सेट है, प्रत्येक 10k numpy matrices के शब्दकोश का प्रतिनिधित्व करता है। फ़ाइलों को स्पष्ट रूप से python2 cPickle द्वारा बनाया गया था।

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

यह काम करता है वास्तव में महान:

मैं इस प्रकार को Python2 से इसे लोड करने की कोशिश की। हालांकि, (कि बजाय cPickle नहीं लेकिन pickle है) अगर मैं python3 से डेटा लोड करने का प्रयास करें, यह विफल रहता है:

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

, तो निम्न त्रुटि के साथ विफल:

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

मैं किसी भी तरह बदलने कर सकते हैं नए डेटा में मूल डेटासेट जो Python3 से पठनीय होगा? या क्या मैं इसे किसी भी तरह से python3 से सीधे पढ़ सकता हूं?

मैं, cPickle द्वारा यह लोड हो रहा है json में डंपिंग और pickle द्वारा इसे वापस पढ़ने की कोशिश की है, लेकिन numpy मैट्रिक्स स्पष्ट रूप से एक json फ़ाइल रूप में नहीं लिखा जा सकता है।

उत्तर

5

आपको उन बाइटर्स के लिए किस कोडेक का उपयोग करना है, या इसे डेटा को bytes के रूप में लोड करने के लिए बताएं। से pickle.load() documentation:

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.

bytes वस्तुओं के रूप में तार कि होगा लोड करने के लिए अगर आप इस सुधार लागू है, तो एक संदेश 'मिल लेखन त्रुटि : एक यूनिकोड वर्ण होना चाहिए, बाइट्स नहीं, आपका numpy संस्करण बहुत पुराना है और [this] (https://github.com/numpy/numpy/issues/4879) बग है। –

+0

लैटिन 1 और बाइट्स –

+0

@ShimonDoodkin का उपयोग करने के लिए बेहतर हो सकता है: जो पूरी तरह से डेटा पर निर्भर करेगा। और सिर्फ इसलिए कि लैटिन -1 हमेशा काम करता है इसका मतलब यह नहीं है कि वास्तव में आपके पास लैटिन -1 डेटा था। –

संबंधित मुद्दे