一:dat文件
在我之前的博客中,我介绍了对txt文件操作的一些相关知识,以及如何对其进行读写操作,也介绍了文本文件和二进制文件的一些区别。虽然对txt文件操作已经能够满足储存数据的需求,但txt文件并不能很好的满足一些工作需求,所以这里我引入对dat文件的操作。
首先,就纯文本类型的数据来说,虽然txt文件已经能够满足存储的需求,但是有时候我们需要将一个如字典和集合这样复杂的对象存入文件中。我们知道txt文件写入操作是将字符串写入文件,如果我们尝试将对象作为操作数输入其中那么就会带来报错,比如下面的这段代码及报错:
>>> infile = open(r'C:\Users\Desktop\test.txt','w')
>>> dic = {'1':'a','2':'b'}
>>> infile.write(dic) #将字典dic写入文件
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
infile.write(dic)
TypeError: write() argument must be str, not dict
或许我们可以将对象强制类型转化为字符串型以后再写入文件,但是这样将完全改变对象的性质。所以为了将对象写入文件,我们在这里介绍序列化对象的相关知识。
二:序列化对象
序列化对象是是将对象转化为字节流的过程,使之便于保存到文件之后读取。在python中,序列化对象的过程可以叫做pickling,而python标准库提供了一个叫做pickle的模块,在序列化对象时需要先导入此模块。既然是对文件进行操作,那么和对txt文件操作一样,我们需要先定义一个文件对象,仍然是用open()函数打开文件,但是打开模式需要注意:
模式 | 描述 |
---|---|
rb | 只读二进制文件,如果文件不存在,则将抛出错误 |
wb | 只写二进制文件,如果文件不存在将创建文件;如果文件已存在将清空之前的内容 |
ab | 附加到二进制文件末尾 |
(1)如果想写入文件,可以按照以下步骤进行:
·导入pickle模块
import pickling
·打开一个二进制文件进行写入
in_file = open(‘file_name.dat’,‘wb’)
·调用pickle模块中的dump方法序列化对象,并写入文件
pickle.dump(object,file) :其中object是欲序列化的变量,file是文件变量
·关闭文件,断开文件和程序的连接
接下来以一段程序为例:
import pickle
infile = open('test.dat','wb') #以wb模式打开文件
dic = {'1':'a','2':'b','2':'3'}
pickle.dump(dic,infile) #序列化对象并写入文件
infile.close()
(2)如果想要从文件读取或解析已经序列化好的对象,可以按照以下步骤进行:
·导入pickle模块
·打开一个二进制文件进行二进制读取
out_file = open(‘test.dat’,‘rb’)
·调用pickle模块中的load方法读取一个文件并解析他
object = pickle.load(file) :其中file是文件对象变量,object将引用文件读取并解析出的一个对象
·关闭文件,断开文件和程序的连接
import pickle
outfile = open('test.dat','rb') #以rb模式打开文件
dic = pickle.load(outfile)
outfile.close()
三:范例
接下来我将以一个简单的学生信息管理程序为范例讲解序列化对象:
import pickle
def main():
choice = int(input('1:存入学生信息数据 2:读取学生信息数据 3:退出'))
while choice!=3:
if choice==1:
load() #存入数据
choice = int(input('1:存入学生信息数据 2:读取学生信息数据 3:退出'))
elif choice==2:
read() #读取数据
choice = int(input('1:存入学生信息数据 2:读取学生信息数据 3:退出'))
def load():
again = 'y'
infile = open('test.dat', 'ab')
while again == 'y':
student = {} #创建一个空的字典
student['ID'] = input('学号:') #以字符串ID为键,以输入内容为值
student['name'] = input('姓名:')
student['address'] = input('地址:')
pickle.dump(student,infile)
again = input('是否继续输入:y/n')
infile.close()
def read():
id = input('请输入欲查找学生id')
outfile = open('test.dat','rb')
end = False #判断是否已经达到test.dat文件末尾
while not end:
try:
student = pickle.load(outfile)
if student['ID'] == id:
print('姓名:',student['name'])
print('地址:',student['address'])
print()
except EOFError: #达到文件末尾
end = True
main()
程序的运行结果截图如下: