有没有一种方法可以在不在Windows中加载Python的情况下查看cPickle或Pickle文件内容



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

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

有什么简单的方法吗?有人有什么建议吗?

注意:我运行的是Windows7。

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

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

将其集成到Windows外壳中应该很容易。

I真的怀疑有什么方法可以做到这一点,因为有了pickle,你几乎可以打包任何东西。当取消pickle时,您需要能够加载对象被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扩展。

您也可以在终端上创建别名,例如:

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

第n个答案通常是您所需要的:

python -m pickle data.pickle

@mgilson指出,如果pickle包含用户定义的数据类型,那么该方法将失败,例如使用

AttributeError: Can't get attribute 'Foo' on <module 'pickle' from '/usr/lib/python3.10/pickle.py'>

在这种情况下,您仍然可以通过pickletools获得至少一些信息,这也更安全,因为它不执行任何pickle字节码:

$ python -m pickletools data.pickle 
0: x80 PROTO      4
2: x95 FRAME      23
11: x8c SHORT_BINUNICODE '__main__'
21: x94 MEMOIZE    (as 0)
22: x8c SHORT_BINUNICODE 'Foo'
27: x94 MEMOIZE    (as 1)
28: x93 STACK_GLOBAL
29: x94 MEMOIZE    (as 2)
30: )    EMPTY_TUPLE
31: x81 NEWOBJ
32: x94 MEMOIZE    (as 3)
33: .    STOP
highest protocol among opcodes = 4

添加-a选项可以解释字节码。我敢说,有一些聪明的计划可以让它变得更漂亮、更有帮助,但这只是一个开始。

相关内容

最新更新