python2 与 python3 使用 pickle 的区别

这两天晚上在看 python 教程,地址是:http://woodpecker.org.cn/abyteofpython_cn/chinese/index.html

因为之前已经将这个教程看过一遍,所以这次看得很快,基本就是将示例程序下载下来,在本机上跑一遍,没有任何问题,分分钟理解。

python 目前有两个大的分支版本,我电脑(ubuntu)上的版本是 python 2.7.4 和 python 3.3.1 。我喜欢新的,所以选择学习 python3 。(其实两个版本差别也没多大)现在接触到的主要是 print 使用上的不同。刚才看到这里:http://woodpecker.org.cn/abyteofpython_cn/chinese/ch12s02.html ,将这个例程下载下来后,照例先使用 2to3 命令将代码转换为 python3 版本的,然后运行,发现出错,在网上搜索一番后,终于可以跑起来了。代码贴在下面,首先是教程下载下来的脚本:

#!/usr/bin/python
# Filename: pickling.py

import cPickle as p
#import pickle as p

shoplistfile = 'shoplist.data'
# the name of the file where we will store the object

shoplist = ['apple', 'mango', 'carrot']

# Write to the file
f = file(shoplistfile, 'w')
p.dump(shoplist, f) # dump the object to a file
f.close()

del shoplist # remove the shoplist

# Read back from the storage
f = file(shoplistfile)
storedlist = p.load(f)
print storedlist

接下来是我先 2to3 命令处理转换完,然后作出细微更改后的脚本:

#!/usr/bin/env python
# Filename: pickling.py

import pickle as p
#import pickle as p

shoplistfile='shoplist.data'
# the name of the file where we will store the object

shoplist=['apple','mango','carrot']

# Write to the file
# 这里由 python2 的 file 改为 open,python3 运行提示错误 file not defined
# 文件打开方式改为以二进制的方式打开 wb 模式
# 之前 w 模式打开会提示错误 TypeError: must be str, not bytes
f=open(shoplistfile,'wb')
p.dump(shoplist,f) # dump the object to a file
f.close()

del shoplist # remove the shoplist

# Read back from the storage
# 同样的 file 改为 open
# 同样的 这里也是以二进制的方式打开 rb 模式
f=open(shoplistfile, 'rb')
storedlist=p.load(f)
print(storedlist)