2015-11-17 9 views
9

मैं पाइथन के लिए नया हूं। मैं किसी और के कोड को पायथन 2.X से 3.5 तक अनुकूलित कर रहा हूं। कोड cpickle के माध्यम से एक फ़ाइल लोड करता है। मैंने सभी "सीपीकल" घटनाओं को "अचार" में बदल दिया क्योंकि मैं 3.5 में अचारित सीपीकल को समझता हूं।पायथन पिकल सीपीकल कहते हैं?

NameError: name 'cPickle' is not defined 

प्रासंगिक कोड:: मैं इस निष्पादन त्रुटि मिलती है

import pickle 
import gzip 
... 
def load_data(): 
    f = gzip.open('../data/mnist.pkl.gz', 'rb') 
    training_data, validation_data, test_data = pickle.load(f, fix_imports=True) 
    f.close() 
    return (training_data, validation_data, test_data) 

pickle.load लाइन में त्रुटि होती है जब load_data() एक और समारोह द्वारा कहा जाता है। हालांकि, ए) न तो cPickle या cpickle अब परियोजना में कहीं भी किसी भी स्रोत फ़ाइलों में दिखाई नहीं दे रहा है (वैश्विक स्तर पर खोजा गया है) और बी) अगर मैं पाइथन शेल में अलग-अलग load_data() के भीतर लाइन चलाता हूं तो त्रुटि तब नहीं होती है (हालांकि, मुझे दूसरा मिलता है डेटा प्रारूप त्रुटि)। picklecPickle पर कॉल कर रहा है, और यदि ऐसा है तो मैं इसे कैसे रोकूं?

शैल: पायथन 3.5.0 | एनाकोंडा 2.4.0 (x86_64) | (डिफ़ॉल्ट 20 Oct 2015, 14:39:26) [जीसीसी 4.2.1 (एप्पल इंक 5577 का निर्माण)] डार्विन

पर

आईडीई: इंटेलीजे 15.0.1, पायथन 3.5.0, एनाकोंडा

आगे बढ़ने के बारे में बताएं। किसी भी मदद की सराहना की। धन्यवाद।

+0

'.pyc' फ़ाइलों के लिए जांचें और उन्हें हटा दें। वे पुराने हो सकते हैं। – user2357112

उत्तर

3

यह उस मसालेदार डेटा की तरह दिख रहा है जिसे आप लोड करने का प्रयास कर रहे हैं जो प्रोग्राम के संस्करण द्वारा जेनरेट किया गया था जो कि पायथन 2.7 पर चल रहा था। डेटा में cPickle के संदर्भ शामिल हैं।

समस्या यह है कि एक धारावाहिक प्रारूप के रूप में पिकल मानता है कि आपकी मानक लाइब्रेरी (और कुछ हद तक आपका कोड) धारावाहिक और deserialization के बीच लेआउट नहीं बदलेगा। जो उसने किया - बहुत - पायथन 2 और 3 के बीच। और जब ऐसा होता है, तो पिकल के पास माइग्रेशन के लिए कोई रास्ता नहीं है।

क्या आपके पास mnist.pkl.gz उत्पन्न करने वाले प्रोग्राम तक पहुंच है? यदि ऐसा है, तो इसे पायथन 3 पर पोर्ट करें और फ़ाइल के पाइथन 3-संगत संस्करण को पुन: उत्पन्न करने के लिए इसे फिर से चलाएं।

यदि नहीं, तो आपको एक पायथन 2 प्रोग्राम लिखना होगा जो उस फ़ाइल को लोड करता है और इसे एक प्रारूप में निर्यात करता है जिसे पायथन 3 से लोड किया जा सकता है (आपके डेटा के आकार के आधार पर, जेएसओएन और सीएसवी लोकप्रिय विकल्प हैं) , फिर एक पायथन 3 प्रोग्राम लिखें जो उस प्रारूप को लोड करता है और फिर इसे पायथन 3 अचार के रूप में डंप करता है। फिर आप उस मूल फ़ाइल से उस अचार फ़ाइल को लोड कर सकते हैं।

बेशक, आपको वास्तव में क्या करना चाहिए उस बिंदु पर रुकें जहां आपके पास पाइथन 3 से निर्यात किए गए प्रारूप को लोड करने की क्षमता है - और उपरोक्त प्रारूप का उपयोग अपने वास्तविक, दीर्घकालिक भंडारण प्रारूप के रूप में करें।

अल्पकालिक क्रमबद्धता के अलावा और कुछ के लिए अचार का उपयोग के बीच भरोसा प्रोग्राम (लोड हो रहा है अचार अपने अजगर वीएम में चल रहा मनमाना कोड के बराबर है) कुछ आप सक्रिय रूप से बचना चाहिए, क्योंकि सटीक मामले आप पाते हैं की अन्य बातों के अलावा है अपने आप में

+0

धन्यवाद मैक्स। मेरे पास उस कोड तक पहुंच नहीं है जो मसालेदार डेटा फ़ाइलों को उत्पन्न करता है लेकिन मैं उन्हें पढ़ने के लिए पायथन 2.7 के तहत दौड़ने का प्रयास कर सकता हूं। –

5

दरअसल, यदि आपने python2.x से मसालेदार वस्तुओं को चुना है, तो आम तौर पर python3.x द्वारा पढ़ा जा सकता है। इसके अलावा, अगर आपके पास python3.x से मसालेदार वस्तुएं हैं, तो उन्हें आम तौर पर python2.x द्वारा पढ़ा जा सकता है, लेकिन केवल तभी उन्हें पर 2 या उससे कम पर सेट किया गया था।

Python 2.7.10 (default, Sep 2 2015, 17:36:25) 
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 
>>> x = [1,2,3,4,5] 
>>> import math 
>>> y = math.sin 
>>>  
>>> import pickle 
>>> f = open('foo.pik', 'w') 
>>> pickle.dump(x, f) 
>>> pickle.dump(y, f) 
>>> f.close() 
>>> 
[email protected]>$ python3.5 
Python 3.5.0 (default, Sep 15 2015, 23:57:10) 
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import pickle 
>>> with open('foo.pik', 'rb') as f: 
... x = pickle.load(f) 
... y = pickle.load(f) 
... 
>>> x 
[1, 2, 3, 4, 5] 
>>> y 
<built-in function sin> 

इसके अलावा, आप देख रहे हैं cPickle के लिए, यह अब _pickle, नहीं pickle है।

>>> import _pickle 
>>> _pickle 
<module '_pickle' from '/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload/_pickle.cpython-35m-darwin.so'> 
>>> 

तुम भी में निर्मित (C++) संस्करण का उपयोग कर से pickle को रोकने के लिए कहा है। यदि आप कक्षा वस्तुओं के साथ काम करना चाहते हैं तो आप _dump और _load, या _Pickler कक्षा का उपयोग कर ऐसा कर सकते हैं। उलझन में? वर्ष cPickle, load, dumps, और loads_pickle करने के लिए सभी बिंदु ... _pickle अब है, लेकिन dump जबकि _dump, _load, _dumps, और शुद्ध अजगर संस्करण के लिए _loads बिंदु। उदाहरण के लिए:

>>> import pickle 
>>> # _dumps is a python function 
>>> pickle._dumps 
<function _dumps at 0x109c836a8> 
>>> # dumps is a built-in (C++) 
>>> pickle.dumps 
<built-in function dumps> 
>>> # the Pickler points to _pickle (C++) 
>>> pickle.Pickler 
<class '_pickle.Pickler'> 
>>> # the _Pickler points to pickle (pure python) 
>>> pickle._Pickler 
<class 'pickle._Pickler'> 
>>> 

तो तुम में निर्मित संस्करण का उपयोग नहीं करना चाहते हैं, तो आप pickle._loads और की तरह उपयोग कर सकते हैं।

0

को

import _pickle as cPickle 

क्रेडिट के रूप में उपयोग कर सकते हैं cPickle यह तकनीकी मुद्दों को नजरअंदाज, लेकिन उस फ़ाइल का नाम mnist_py3k.pkl के py3 संस्करण हो सकता है .gz यदि हां, तो उस फ़ाइल को इसके बजाय खोलने का प्रयास करें।

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