【问题标题】:Is there a way to view cPickle or Pickle file contents without loading Python in Windows?有没有办法在 Windows 中不加载 Python 来查看 cPickle 或 Pickle 文件内容?
【发布时间】:2012-11-26 16:18:26
【问题描述】:

我使用 cPickle 来保存程序每次运行的数据集。由于我有时需要在不运行代码的情况下查看数据的轮廓,因此我想要一种简单的方法,只需双击文件即可快速查看内容。我试图避免每次都加载终端并将python指向一个文件,只是为了运行一些print脚本。

我寻找 Notepad++ 插件,但找不到任何东西。

有没有一些简单的方法可以做到这一点?有人有什么建议吗?

注意:我运行的是 Windows 7。

【问题讨论】:

  • 您可以使用ASCII protocolpickle,这可以从记事本中读取(尽管它看起来不太好,尤其是如果您将复杂的对象放在那里)。
  • 我刚刚创建了一种使用动态创建的(假的)模块和类来解开事物的方法 - 它应该可以帮助人们到达这里 - stackoverflow.com/a/54048296/108205

标签: python pickle


【解决方案1】:

对于 Python 3.2+/2.7+,您可以从命令行查看(__repr__ 的)泡菜:

$ python -c "import pickle; pickle.dump({'hello': 'world'}, open('obj.dat', 'wb'))"
$ python -mpickle obj.dat
{'hello': 'world'}

应该很容易将它集成到 Windows shell 中。

【讨论】:

  • 这正是我在谷歌上搜索这个问题(2017 年)时正在寻找的答案。它应该被标记为接受的答案。
  • 非常有用!它似乎也适用于 Python 2.7 泡菜,至少对于我需要它的单一情况。
  • @Hans-MartinMosner 谢谢我更新了答案。可能它被反向移植了。
  • 我试过这个,这里的例子有效,但不是我保存的泡菜。我得到了:File "/lib/python3.4/site-packages/pyshark/packet/fields.py", line 88, in __new__ AttributeError: 'str' object has no attribute 'get_default_value'
  • @JoelCross 我不确定__repr__ 能否始终提供正确的、可反序列化的值。它本质上打印一个树结构,其中任何节点都可以通过树中任何其他节点的引用来进行。这种数据结构不能以简单的方式序列化。在这种情况下,接受的答案侧重于完美性,而这个答案是实用性,两者都有存在的权利(注意,我也发现这个答案在我的具体情况下很有用)。
【解决方案2】:

真的怀疑有什么办法可以做到这一点,因为有了pickle,你几乎可以打包任何东西。取消腌制时,您需要能够加载在腌制对象时加载的模块等。换句话说,一般来说,为了能够unpickle 某些东西,python 需要能够重现程序的“环境”(或至少足够接近的近似值)——加载的模块、全局命名空间中的类、等等......一般来说,如果没有用户的帮助,这是不可能的。考虑:

import pickle
class Foo(object): pass

a = Foo()
with open('data.pickle','wb') as f:
    pickle.dump(a,f)

现在,如果您尝试在单独的脚本中恢复它,python 无法知道 Foo 的样子,因此它无法恢复该对象(除非您在该脚本中定义了合适的 Foo 对象)。这实际上不是一个可以在没有一些人为干预的情况下完成的过程。

当然,可以尝试一个可以说是有用的特殊情况,即您只是从标准库中腌制内置对象和事物……但我认为您不能编写通用的 unpickler 扩展。

【讨论】:

  • 不知道pickle,但没有什么能阻止协议在其输出​​中存储“环境”的所有必要信息。在这种情况下,这将是相当微不足道的:我们存储了一个没有额外参数的新型类。所以这样做当然是可能的——它可能只是意味着存储相当多的额外信息。
【解决方案3】:

您也可以在终端上设置别名,例如:

alias pvw="python -mpickle "

就我而言:

pvw obj.dat                                   
         ID    A_ID   B_ID   PAST_ID
    0    20    1008   4771     425  
    1    20    2000   4771     425  
    2    20    2015   4771     425

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2015-11-02
    相关资源
    最近更新 更多