【问题标题】:Using zlib and cPickle to compress/decompress a dictionary to files使用 zlib 和 cPickle 将字典压缩/解压缩为文件
【发布时间】:2012-09-03 06:08:41
【问题描述】:

我正在使用 python 将 zlib 压缩和 cPickled 字典写入文件。它似乎可以工作,但是,我无法弄清楚如何重新读取文件。

我包含以下代码,其中包括我尝试过的几件事(以及相关的错误消息)。我无处可去。

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

我收到以下错误:

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

希望这只是我缺少的一些明显(对其他人)的修复。感谢您的帮助!

【问题讨论】:

    标签: python zlib pickle


    【解决方案1】:

    您在尝试 3-5 时遇到的错误是因为您使用的是 pickle.load 而不是 pickle.loads。前者需要一个类似文件的对象,而不是您从解压缩调用中获得的字节字符串。

    这将起作用:

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

    【讨论】:

      【解决方案2】:

      根据pickle手册你需要使用pickle.load*s*http://docs.python.org/release/2.5/lib/node317.html(显然去掉'*')

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-08
        相关资源
        最近更新 更多