【问题标题】:How to identify if a byte string is a pickled object?如何识别字节字符串是否是腌制对象?
【发布时间】:2017-01-29 17:13:55
【问题描述】:

如何识别字节字符串对象是否为腌制对象。

例如,在下面的字典中,我如何识别b 是腌制对象而其他对象不是?

example = {'a':1, 'b':b'\x80\x03K\x02.', 'c':b'3'}

【问题讨论】:

标签: python python-3.x pickle


【解决方案1】:

虽然有一些方法可以判断一个流是否可能是一个泡菜流(例如第一个字节总是\x80,后面是协议号,这里是\x03,最后一个字节也总是b'.'),通常很难确定(第一个字节是随机字符串中的\x80可能是巧合)。所以你最好简单地尝试解开它,看看是否可行:

import pickle

def is_pickle_stream(stream):
    try:
        pickle.loads(stream)
        return True
    except UnpicklingError:
        return False

如果流是pickle流,上述方法将返回True,如果不是,则返回False,如果loads抛出异常(内存不足等),则抛出异常。

【讨论】:

  • 虽然我同意这是对身份的真正测试,但如果对象非常大,那么尝试将整个东西拆开以确认它是泡菜是很不幸的。您不妨假设它是并返回 unpickled 的 obj,如果出现 unpickling 错误,则返回 str。但我认为如果只是检查,您首先突出显示的抢先标记可能会更好。
猜你喜欢
  • 1970-01-01
  • 2011-05-26
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
相关资源
最近更新 更多