【问题标题】:Truncating and rewriting a pickle file raises KeyError '\x00'截断和重写泡菜文件会引发 KeyError '\x00'
【发布时间】:2018-08-06 11:03:26
【问题描述】:

我在转储数据后尝试截断 pickle 文件,但它似乎不像 .txt 文件那样工作。

dic1 = {'a': 1, 'b': 2}
dic2 = {'c': 3, 'd': 4}
f = open("data.pk", "wb+")
pickle.dump(dic1, f)
f.truncate(0)
pickle.dump(dic2, f)
f.seek(0)
print pickle.load(f)
f.close()

此代码引发 KeyError: '\x00'。似乎 truncate(0) 不会截断文件,而是添加了一些字符,例如 '\x00'。

我可以在不关闭和重新打开的情况下删除泡菜文件的内容吗?

【问题讨论】:

    标签: python file pickle python-2.x truncate


    【解决方案1】:

    file.truncate改变文件大小,但是,根据docs

    当前文件位置没有改变。

    这可以通过在截断后调用文件的tell 方法来演示。

    >>> d1 = dict(a=1, b=2)
    >>> d2 = dict(c=3, d=4) 
    
    >>> with open('file.bin', 'wb+') as f:
    ...     pickle.dump(d1, f)
    ...     f.truncate(0)
    ...     print 'File pointer position:', f.tell()
    ...     pickle.dump(d2, f)
    ...     f.seek(0)
    ...     pickle.load(f)
    ... 
    File pointer position: 30
    Traceback (most recent call last):
      File "<stdin>", line 7, in <module>
      File "/usr/lib64/python2.7/pickle.py", line 1384, in load
        return Unpickler(file).load()
      File "/usr/lib64/python2.7/pickle.py", line 864, in load
        dispatch[key](self)
    KeyError: '\x00'
    

    将文件指针重置到文件的开头会产生所需的行为*

    >>> with open('file.bin', 'wb+') as f:
    ...     pickle.dump(d1, f)
    ...     f.truncate(0)
    ...     f.seek(0)
    ...     pickle.dump(d2, f)
    ...     f.seek(0)
    ...     pickle.load(f)
    ... 
    {'c': 3, 'd': 4}
    

    * 至少,它会在我的 Linux 机器上产生所需的行为。 cmets 中对this question 的讨论表明这可能不适用于所有平台。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 2012-01-02
      • 2018-07-22
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 2020-11-07
      相关资源
      最近更新 更多