目录
1.对象持久化
2.字符串操作
本节讲对象持久化的相关概念,当我们运行一个游戏程序时其实程序是跑在内存里的,当我们在游戏中保存游戏存档,就是将内存持久化的过程,以后我们在读取游戏可以直接从持久化的文件里读取进内存继续游戏。持久化有多种方式:主要有存储为扁平文件(文本文件)、pickle模块、shelve模块、数据库、ORM。
之后我们学习了字符串的实质,字符串编码之间的关系,以及Python中将字符串编码到字节和字节解码为字符串操作的过程。
1.对象持久化
- 存储为扁平文件(文件格式)
存储为扁平文件不好还原对象的格式,如下图将一个列表对象存储为字符串存入文档中,在读取时将文件变为列表,对列表原位改变
程序运行结果:
不符合我们预期的[99,99,77,55]
可以使用eval()函数——可将字符串还原成表达式
得到符合我们预期的运行结果:
- pickle模块
pickle模块可以保持对象的格式
pickle序列化为字符串:pickle.dumps(obj) : 将对象序列为字符串 、 pickle.loads(s) :从字符串反序列化对象
pickle序列化对象到文件:pickle.dump(obj,file) pickle.load(file)
- shelve模块
pickle模块可以将对象类型保持,但是同时存储多个对象时容易发生错误,shelve模块可以同时持久化多个不同类型的对象
db = shelve.open('dbfile')
db.close()
db['key'] = obj 以字典表的形式将对象传入
len(db)
del db['key']
2.字符串操作
概述
- 类型:str字符串、bytes字节、bytearray字节数组
- 字符编码架构:
- 字符集:赋值一个编码到某个字符,以便在内存中表示,常用的字符集有utf-8、ASCII、gbk……
- 编码encoding:转换字符到原始的字节形式,编码只适用于文件存储或中间媒介转换时
- 解码 Decoding:依据编码名称转换原始字节到字符的过程,内存中总是存储解码以后的文本
字符编码(字符集)
- ASCII:存储在Byte 0-127 存储数字,字母,常用标点
- latin-1:存储在一个Bytes 128-255 存储拉丁字母等
- UTF-8:是可变字节的编码格式,也是最常用的编码格式,其中0-127使用单字节,128-2047双字节,>2047三到四字节,
- UTF-16:2 字节存储字符 (另加2Byte作为标识)
- UTF-32:4字节
内置函数
- ord() 获取字符代码点
- chr() 获取代码对应字符
- str.encode('ASCII/UTF-8') 将特定字符编码
- bytes.decode('编码‘) 将字符串解码为字符文本
注:encode() decode()在不指定字符集时是utf8编码 ,文件操作在不指定读写操作时是gbk编码
类型转换
将字符串转换为字节
- 手动声明 b''
- 字符串编码 str.encode()
- 构造函数 bytes()
将字符串转换为字节数组bytearray,字节数组虽然是字节但可以使用列表的操作方法,如+,append
- bytearray('字符','编码')
- .decode() 解码为字符串
BOM处理
读取别人的文档时有时会发现字符串前面出现\ufeff而后面却没有问题,这是由于在存储时加入了字节存储顺序,不是由于解码与编码格式不同造成的仔解码时加上-sig可以解决这个问题
自己存储文档时也可以加上字节存储顺序,只要加上-sig标识