6.3.1 使用 pickle 模块读写二进制文件
Python 标准库 pickle 提供的 dump() 方法 用于将数据进行序列化并写入文件(dump() 方法的protocol 参数为True 时可以实现压缩的效果),而load() 用于读取二进制文件内容并进行反序列化,还原为原来的信息。
1 使用 pickle模块写入二进制文件。
1 #导入模块
2 import pickle
3
4 #准备要序列化的数据
5 n = 7
6 i = 13000000
7 a = 99.056
8 s = '中国人民 123abc'
9 lst = [[1,2,3],[4,5,6],[7.8,9]]
10 tu = (-5,10,8)
11 coll = {4,5,6}
12 dic = {'a':'apple','b':'banana','g':'grape','o':'orange'}
13 aa = 'c'
14
15 #以写模式打开二进制文件
16 f = open('sample_pickle.dat','wb')
17 try:
18 pickle.dump(n,f) #对象个数
19 pickle.dump(i,f) #写入整数
20 pickle.dump(a,f) #写入实数
21 pickle.dump(s,f) #写入实数
22 pickle.dump(lst,f) #写入列表
23 pickle.dump(tu,f) #写入元组
24 pickle.dump(coll,f) #写入集合
25 pickle.dump(dic,f) #写入字典
26 except:
27 print('写文件异常')
28 finally:
29 f.close()
30
31 #看一下文件内容,已经写入成功。
2 使用 pickle 模块读取上例写入二进制文件的内容
1 #导入模块
2 import pickle
3
4 #打开二进制文件
5 f = open('sample_pickle.dat','rb')
6 n = pickle.load(f)
7 print(n) #读取文件中数据个个数 7
8
9 for i in range(n): #文件中有多少个对象就循环多个少次
10 x = pickle.load(f) #依次读取文件中对象
11 print(x)
12 f.close()
13
14 '''
15 7
16 13000000
17 99.056
18 中国人民 123abc
19 [[1, 2, 3], [4, 5, 6], [7.8, 9]]
20 (-5, 10, 8)
21 {4, 5, 6}
22 {'a': 'apple', 'b': 'banana', 'g': 'grape', 'o': 'orange'}
23 '''
小提示:pickle 模块还提供了一个 dumps() 方法,可以返回对象序列化之后的字节形式,例如:
1 >>> import pickle
2 >>> pickle.dumps([1,2,3])
3 b'\x80\x03]q\x00(K\x01K\x02K\x03e.'
4 >>>
5 >>> pickle.dumps([1,2,3,4])
6 b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04e.'
7 >>>
8 >>> pickle.dumps({1,2,3,4})
9 b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02K\x03K\x04e\x85q\x02Rq\x03.'
10 >>>
11 b'\x80\x03K\x01K\x02K\x03\x87q\x00.'
12 >>>
13 >>> pickle.dumps(123)
14 b'\x80\x03K{.'
15 >>>
拓展阅读:下面的代码可以用来把文本文件转换为二进制文件,其中,infomation.txt是包含若干文本信息的源文件,infomation_pickle.dat是转换后的二进制文件。
1 #导入模块
2 import pickle
3
4 with open('infomation.txt','r',encoding='utf-8') as src,open('infomation_pickle.dat','wb') as dest:
5 lines = src.readlines() #把源文件中的所有内容都读取到 lines 列表中
6 pickle.dump(len(lines),dest) #先写入对象个数
7 for line in lines:
8 pickle.dump(line,dest)
9
10 #上面就是已经把数据写入到二进制文件中了,下面从二进制文件中反序列化对象
11 with open('infomation_pickle.dat','rb') as f:
12 n = pickle.load(f)
13 for i in range(n):
14 print(pickle.load(f))