2010-11-25 6 views
7

साथ uncompressing अजगर 2.5 मैं संग्रहीत डेटा में इस कोड का उपयोग:Unpicking अजगर 2.5 में मसालेदार डेटा, अजगर 3.1 में तो zlib

def GLWriter(file_name, string): 
    import cPickle 
    import zlib 
    data = zlib.compress(str(string)) 
    file = open(file_name, 'w') 
    cPickle.dump(data, file) 

यह ठीक काम किया है, मैं में है कि इस प्रक्रिया करके उस डेटा को पढ़ने में सक्षम था रिवर्स। इसे सुरक्षित होने की आवश्यकता नहीं थी, केवल कुछ ऐसा जो मानव आंखों के लिए पठनीय नहीं था। मैं इस पर "परीक्षण" रखा और फिर फ़ाइल यह बनाया खोला है, यह इस तरह से देखा:

S'x\x9c+I-.\x01\x00\x04]\x01\xc1' 
p1 
. 

विभिन्न कारणों के लिए अब हम अजगर 3.1 का उपयोग करने के लिए मजबूर कर रहे हैं और हम कुछ इन पढ़ सकते हैं कि कोड करने के लिए की जरूरत है डेटा की फ़ाइलें।

अचार अब स्ट्रिंग इनपुट स्वीकार नहीं करता है इसलिए मुझे फ़ाइल को "आरबी" के साथ खोलना पड़ा है। जब मैं ऐसा और pickle.load (फाइल) के साथ इसे खोलने का प्रयास करें, मैं इस त्रुटि मिलती है:

File "<stdin>", line 1, in <module> 
File "C:\Python31\lib\pickle.py", line 1365, in load 
    encoding=encoding, errors=errors).load() 
UnicodeDecodingError: 'ascii' codec can't decode byte 0x9c in position 1: ordinal not in range(128) 

ढूंढ़ना है कि मैं अचार में फ़ाइल खोलने के लिए सक्षम नहीं हो सकता है, मैं कुछ शोध करना शुरू कर दिया और पाया कि अचार केवल जेएलआईबी उत्पादन कर रहे डेटा के मुख्य ब्लॉक के प्रत्येक पक्ष को कुछ अक्षर लपेट रहा है। मैंने फिर इसे आउटपुट zlibs करने के लिए नीचे ट्रिम करने की कोशिश की और zlib.decompress के माध्यम से डाल दिया। मेरा मुद्दा यह है कि यह फ़ाइल को पढ़ता है और "\ x04" की पसंद को चार वर्णों के बजाय एक के रूप में व्याख्या करता है। बहुत सारे परीक्षण और बाद में खोज रहे हैं और मुझे अचार को फ़ाइल लोड करने का कोई तरीका नहीं मिल रहा है, या पाइथन इन कोडों को पहचानने के लिए एक रास्ता नहीं ढूंढ सकता है, इसलिए मैं इसे zlib के माध्यम से रख सकता हूं।

तो मेरा प्रश्न यह है: मैं Python3.1 का उपयोग कर मूल डेटा कैसे पुनर्प्राप्त कर सकता हूं?

मुझे अपने ग्राहकों से Python2.5 स्थापित करने और मैन्युअल रूप से करने के लिए पूछना अच्छा लगेगा लेकिन यह संभव नहीं है।

आपकी सहायता के लिए बहुत धन्यवाद!

उत्तर

10

समस्या यह है कि पायथन 3 मसालेदार पायथन 2 स्ट्रिंग को str ऑब्जेक्ट में परिवर्तित करने का प्रयास कर रहा है, जब आपको वास्तव में bytes होने की आवश्यकता होती है। यह ascii कोडेक का उपयोग करता है, जो सभी 256 8-बिट वर्णों का समर्थन नहीं करता है, इसलिए आपको अपवाद मिल रहा है।

आप इस के आसपास latin-1 एन्कोडिंग (जो सभी 256 वर्णों का समर्थन करता है) का उपयोग कर, और फिर वापस bytes में स्ट्रिंग एन्कोडिंग से काम कर सकते हैं:

s = pickle.load(f, encoding='latin1') 
b = s.encode('latin1') 
print(zlib.decompress(b)) 
+1

वाह, यह पूरी तरह से काम करता है! बहुत बहुत धन्यवाद! –

0

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

open(file_name, 'wb')