【问题标题】:allowing / parsing compressed or uncompressed pickles or json files?允许/解析压缩或未压缩的泡菜或 json 文件?
【发布时间】:2021-01-01 18:40:14
【问题描述】:

我想写一个将文件名作为输入的方法,然后检查文件是否被压缩(gzip、xz/LZMA、无),然后检查文件的内容是否是腌制的python 对象或 JSON 编码的字典。这里的目标是为用户在存储/编码数据的方式上提供一定程度的灵活性,这最终只是一堆字符串......

构建这段代码最明智的方式是什么?我只是try 用每个支持的(解)压缩器打开文件,还是有更好的方法来确定文件类型并调用相应的open 方法?

内部数据的类似问题...除了实际尝试 json.load()pickle.load() 并捕获异常之外,是否有一些更优雅/高效/可维护的方法来做到这一点?

我知道我可以将足够多的 if-then-else 或 try-except 逻辑组合在一起以使其工作,但我对此还不够新,我想至少征求意见,了解可能导致最有意义。我想在某种意义上我是在问哲学是否应该是

  • “探测一些东西以找出文件实际上是什么,然后根据该答案调用打开/加载”
    • 相对于 ...
  • “循环,尝试所有你知道如何处理的事情,最终使用不会引发异常的事情”

【问题讨论】:

    标签: python json compression pickle


    【解决方案1】:

    xz 文件的前六个字节是十六进制的fd 37 7a 58 5a 00。 gz 文件的前三个字节是1f 8b 08

    JSON 流必须以 '{''[' 开头。 pickle 文件必须以操作码 which today does not include '{''[''\xfd''\x1f' 开头。

    因此,除非将操作码添加到与 JSON 或压缩数据签名重叠的 pickle 格式,并且如果您知道您的输入必须是这四个之一,并且解压缩数据必须是这两个之一,那么看起来像您可以为所欲为。

    请注意,解码 pickle 格式可以有效地执行 Python 代码,因此它不被认为是安全的。它不应与不受信任的发起者一起使用。

    从链接源中抓取,这里是 Python 3.8.1 pickle 操作码:

    '(', ')', '.', '0', '1', '2', 'B', 'C', 'F', 'G', 'I', 'J', 'K', 'L', 'M', 'N',
    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'X', ']', 'a', 'b', 'c', 'd', 'e', 'g',
    'h', 'i', 'j', 'l', 'o', 'p', 'q', 'r', 's', 't', 'u', '}', '\x80', '\x81',
    '\x82', '\x83', '\x84', '\x85', '\x86', '\x87', '\x88', '\x89', '\x8a', '\x8b',
    '\x8c', '\x8d', '\x8e', '\x8f', '\x90', '\x91', '\x92', '\x93', '\x94', '\x95',
    '\x96', '\x97', '\x98'
    

    【讨论】:

      猜你喜欢
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 2011-06-28
      • 2010-09-05
      相关资源
      最近更新 更多