2012-09-03 4 views
8

Sto usando python per scrivere in un file un dizionario zlib compresso e cPickled. Sembra funzionare, tuttavia, non riesco a capire come leggere il file di nuovo.Utilizzo di zlib e cPickle per comprimere/decomprimere un dizionario in file

Sto includendo il seguente codice che include molte delle cose che ho provato (e dei messaggi di errore associati). Non sto andando da nessuna parte.

import sys 
import cPickle as pickle 
import zlib 

testDict = { 'entry1':1.0, 'entry2':2.0 } 

with open('test.gz', 'wb') as fp: 
    fp.write(zlib.compress(pickle.dumps(testDict, pickle.HIGHEST_PROTOCOL),9)) 

attempt = 0 

try: 
    attempt += 1 
    with open('test.gz', 'rb') as fp: 
    step1 = zlib.decompress(fp) 
    successDict = pickle.load(step1) 
except Exception, e: 
    print "Failed attempt:", attempt, e 

try: 
    attempt += 1 
    with open('test.gz', 'rb').read() as fp: 
    step1 = zlib.decompress(fp) 
    successDict = pickle.load(step1) 
except Exception, e: 
    print "Failed attempt:", attempt, e 

try: 
    attempt += 1 
    with open('test.gz', 'rb') as fp: 
    step1 = zlib.decompress(fp.read()) 
    successDict = pickle.load(step1) 
except Exception, e: 
    print "Failed attempt:", attempt, e 

try: 
    attempt += 1 
    with open('test.gz', 'rb') as fp: 
    d = zlib.decompressobj() 
    step1 = fp.read() 
    step2 = d.decompress(step1) 
    step3 = pickle.load(step2) 
except Exception ,e: 
    print "Failed attempt:", attempt, e 

try: 
    attempt += 1 
    with open('test.gz', 'rb') as fp: 
    d = zlib.decompressobj() 
    step1 = fp.read() 
    step2 = d.decompress(step1) 
    step3 = pickle.load(step2) 
except Exception ,e: 
    print "Failed attempt:", attempt, e 

ottengo i seguenti errori:

Failed attempt: 1 must be string or read-only buffer, not file 
Failed attempt: 2 __exit__ 
Failed attempt: 3 argument must have 'read' and 'readline' attributes 
Failed attempt: 4 argument must have 'read' and 'readline' attributes 
Failed attempt: 5 argument must have 'read' and 'readline' attributes 

Speriamo che questo sia solo alcuni evidenti (a qualcun altro) fissare che io sono solo manca. Grazie per l'aiuto!

risposta

8

Gli errori che si ottengono sui tentativi 3-5 sono perché si sta utilizzando pickle.load invece di pickle.loads. Il primo si aspetta un oggetto simile a un file, piuttosto che la stringa di byte che si ottiene dalle chiamate di decompressione.

Ciò funzionerà:

with open('test.gz', 'rb') as fp: 
    data = zlib.decompress(fp.read()) 
    successDict = pickle.loads(data)