目录

1.对象持久化

2.字符串操作


本节讲对象持久化的相关概念,当我们运行一个游戏程序时其实程序是跑在内存里的,当我们在游戏中保存游戏存档,就是将内存持久化的过程,以后我们在读取游戏可以直接从持久化的文件里读取进内存继续游戏。持久化有多种方式:主要有存储为扁平文件(文本文件)、pickle模块、shelve模块、数据库、ORM。

之后我们学习了字符串的实质,字符串编码之间的关系,以及Python中将字符串编码到字节和字节解码为字符串操作的过程。

1.对象持久化

  • 存储为扁平文件(文件格式)

存储为扁平文件不好还原对象的格式,如下图将一个列表对象存储为字符串存入文档中,在读取时将文件变为列表,对列表原位改变

python 持久化int python 对象持久化_字符串操作

 

程序运行结果:

python 持久化int python 对象持久化_python 持久化int_02

不符合我们预期的[99,99,77,55]

可以使用eval()函数——可将字符串还原成表达式

python 持久化int python 对象持久化_持久化_03

得到符合我们预期的运行结果:

python 持久化int python 对象持久化_字符串_04

 

  • pickle模块

pickle模块可以保持对象的格式

pickle序列化为字符串:pickle.dumps(obj) : 将对象序列为字符串 、 pickle.loads(s) :从字符串反序列化对象

python 持久化int python 对象持久化_持久化_05

pickle序列化对象到文件:pickle.dump(obj,file)     pickle.load(file)

python 持久化int python 对象持久化_字符串_06

 

  • shelve模块

pickle模块可以将对象类型保持,但是同时存储多个对象时容易发生错误,shelve模块可以同时持久化多个不同类型的对象

db = shelve.open('dbfile')  

db.close()

db['key'] = obj    以字典表的形式将对象传入

len(db)

del db['key']

python 持久化int python 对象持久化_字符串操作_07

2.字符串操作

概述

  • 类型:str字符串、bytes字节、bytearray字节数组
  • 字符编码架构:

python 持久化int python 对象持久化_python 持久化int_08

  • 字符集:赋值一个编码到某个字符,以便在内存中表示,常用的字符集有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() 获取代码对应字符

python 持久化int python 对象持久化_持久化_09

  • str.encode('ASCII/UTF-8') 将特定字符编码
  • bytes.decode('编码‘) 将字符串解码为字符文本

注:encode() decode()在不指定字符集时是utf8编码 ,文件操作在不指定读写操作时是gbk编码

类型转换

将字符串转换为字节

  • 手动声明 b''
  • 字符串编码 str.encode()
  • 构造函数 bytes()

python 持久化int python 对象持久化_字符串_10

将字符串转换为字节数组bytearray,字节数组虽然是字节但可以使用列表的操作方法,如+,append

  • bytearray('字符','编码')
  • .decode() 解码为字符串

python 持久化int python 对象持久化_python 持久化int_11

python 持久化int python 对象持久化_持久化_12

BOM处理

读取别人的文档时有时会发现字符串前面出现\ufeff而后面却没有问题,这是由于在存储时加入了字节存储顺序,不是由于解码与编码格式不同造成的仔解码时加上-sig可以解决这个问题

python 持久化int python 对象持久化_字符串操作_13

自己存储文档时也可以加上字节存储顺序,只要加上-sig标识

python 持久化int python 对象持久化_字符串_14