Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 允许/解析压缩或未压缩的pickle或json文件?_Python_Json_Compression_Pickle - Fatal编程技术网

Python 允许/解析压缩或未压缩的pickle或json文件?

Python 允许/解析压缩或未压缩的pickle或json文件?,python,json,compression,pickle,Python,Json,Compression,Pickle,我想编写一个方法,将文件名作为输入,然后检查文件是否被压缩(gzip,xz/LZMA,none),然后检查文件的内容是pickle python对象还是JSON编码的字典。这里的目标是为用户提供一定程度的灵活性,让他们能够存储/编码数据,而这些数据最终只是一堆字符串 构建这段代码最合理的方式是什么?我是否只是尝试用每个支持的(de)压缩器打开文件,还是有更好的方法来确定文件类型并调用相应的open方法 类似的问题为数据内。。。除了实际尝试json.load()或pickle.load()并捕获异

我想编写一个方法,将文件名作为输入,然后检查文件是否被压缩(gzip,xz/LZMA,none),然后检查文件的内容是pickle python对象还是JSON编码的字典。这里的目标是为用户提供一定程度的灵活性,让他们能够存储/编码数据,而这些数据最终只是一堆字符串

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

类似的问题为数据内。。。除了实际尝试
json.load()
pickle.load()
并捕获异常之外,还有其他更优雅、更高效、更易于维护的方法吗

我知道我可以用其他方法或尝试除逻辑之外的其他方法来完成这项工作,但我对这一点还很陌生,我想至少征求一下最有意义的方面的意见。我想在某种意义上我是在问,哲学是否应该

  • 探测某些内容以确定文件的实际内容,然后根据该答案调用打开/加载
    • 相对于
  • “循环,尝试所有您知道如何处理的事情,最终使用不会引发异常的”

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

      JSON流必须以
      '{'
      '['
      开头。pickle文件必须以操作码、
      '{'
      '['
      '\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'