我使用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
选项可以解释字节码。我敢说,有一些聪明的计划可以让它变得更漂亮、更有帮助,但这只是一个开始。