小甲鱼Python第031讲:永久存储:腌制一缸美味的泡菜 | 课后测试题及参考答案
0.pickle的实质是什么?
主要就是利用一些算法将你的数据对象“腌制”成二进制文件,存储在磁盘上,当然也可以放在数据库或者通过网络传输到另一台计算机上。
1.使用pickle的什么方法存储数据?
pickle.dump(data,file).
其中,第一个参数data表示待存储的数据对象;第二个参数表示目标存储的文件对象。注意要先使用“wb”的模式open文件。
2.使用pickle的什么方法读取数据?
pickle.load(file)
其中参数表示目标存储的文件对象,注意要先使用“rb”的模式open文件。
3.使用pickle能不能保存为“.txt”类型的文件?
可以。不过打开后是乱码。因为打开模式为二进制模式。
动动手:
0.编写一个程序,这次要求使用pickle将文件(record.txt)里的对话按照以下要求腌制成不同的文件(没错,是第29讲的内容小改,考考你自己能写出来吗?)
- 小甲鱼的对话单独保存为boy_*.txt(去掉“小甲鱼:”)
- 小客服的对话单独保存为girl_*.txt(去掉“小客服:”)
- 文件中总共有三段对话,分别保存为boy_1.txt,girl_1.txt,boy_2.txt,girl_2.txt,boy_3.txt,girl_3.txt共6 个文件。注意可以按照对话间的“=======”分割
代码实现:
1 # 正常 2 def save_file(boy,girl,count): 3 file_name_boy = "boy_"+ count + ".txt" 4 file_name_girl = "girl_" + count + ".txt" 5 6 boy_file = open(file_name_boy,"w") 7 girl_file = open(file_name_girl, "w") 8 9 boy_file.writelines(boy) 10 girl_file.writelines(girl) 11 12 boy_file.close() 13 girl_file.close() 14 15 def split_file(file_name): 16 count = 1 17 boy = [] 18 girl = [] 19 f = open(file_name) 20 for each_line in f: 21 if each_line[:6] != "======": 22 role = each_line.split(":",1)[0] 23 line_speak = each_line.split(":",1)[1] 24 if role == "小甲鱼": 25 boy.append(line_speak) 26 if role == "小白": 27 girl.append(line_speak) 28 else: 29 save_file(boy,girl,count) 30 boy = [] 31 girl = [] 32 count += 1 33 34 save_file(boy,girl,count) 35 f.close() 36 split_file("record.txt") 37 38 # pickle 39 import pickle 40 def save_file_pkl(boy,girl,count): 41 file_name_boy = "boy_" + count + ".txt" 42 file_name_girl = "girl_" + count + ".txt" 43 44 boy_file = open(file_name_boy,"wb") 45 girl_file = open(file_name_girl,"wb") 46 47 pickle.dump(boy,boy_file) 48 pickle.dump(girl,girl_file) 49 50 boy_file.close() 51 girl_file.close() 52 53 def split_file_pkl(file_name): 54 count = 1 55 boy = [] 56 girl = [] 57 f = open(file_name) 58 for each_line in f: 59 if each_line[:6] != "======": 60 data = each_line.split(":",1) 61 role = data[0] 62 line_speak = data[1] 63 if role =="小甲鱼": 64 boy.append(line_speak) 65 if role == "小白": 66 girl.append(line_speak) 67 else: 68 save_file_pkl(boy,girl,count) 69 count += 1 70 boy = [] 71 girl = [] 72 save_file_pkl(boy,girl,count) 73 f.close() 74 split_file_pkl("record.txt") 75 76 # 注释:函数只有在save_file()中存在差别。