Python对象持久化与字符串
- 目录
- 一.对象持久化
- 1.1 扁平文件
- 1.2 pickle模块
- 1.3 shelve
- 二.字符串
- 2.1 概述
- 2.2字符编码
- 2.3 内置函数
- 2.4 类型转换
- 2.5 BOM处理
目录
一.对象持久化
1.1 扁平文件
使用格式化文本
>>> myfile = open('hello.txt','w')
>>> myfile.write("你好啊,我叫赛利亚\n") #写入文件
10
>>> myfile.close()
>>> f = open('hello.txt')
>>> f.read()
'你好啊,我叫赛利亚\n'
>>> f.read()
''
>>> f = open('hello.txt')
>>> f.readline() #readline一次读取一行,返回字符串
'你好啊,我叫赛利亚\n'
>>> f.readline()
''
>>> l = open('hello.txt').readlines() #readline一次读取全部行,返回列表
>>> l
['你好啊,我叫赛利亚\n']
1.2 pickle模块
1.序列化为字符串
pickle.dumps(obj) : 将对象序列化为字符串
pickle.loads(str) : 从字符串里反序列化对象
>>> import pickle
>>> person = {'name':'Tom','age':20}
>>> s = pickle.dumps(person) #序列化成字符串
>>> s #此时s中存储的是字节字符串
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00Tomq\x02X\x03\x00\x00\x00ageq\x03K\x14u.'
>>> p = pickle.loads(s) #反序列化,从字符串里载入对象
>>> p
{'name': 'Tom', 'age': 20}
2.序列化对象到文件
pickle.dumps(obj,file) : 将对象序列化到文件
pickle.load(file) : 从文件里反序列化对象
>>> import pickle
>>> pickle.dump(person,open('pickle.db','wb'))
>>> p = pickle.load(open('pickle.db','rb'))
>>> p
{'name': 'Tom', 'age': 20}
1.3 shelve
可将多个对象存储到同一个文件中
shelve.open('dbfile') : 构造数据库文件
db['key'] = obj : 将对象序列化到文件
len(db) : 检查对象数量
del db['key'] : 删除一个成员
>>> import shelve
>>> scores = [99 ,98 ,97]
>>> student = {'name':'Mike','age':20}
>>> db['s'] = student
>>> db['scores'] = scores
>>> len(db)
2
>>> temp_student = db['s']
>>> temp_student
{'name': 'Mike', 'age': 20}
二.字符串
2.1 概述
1.类型
str 字符串
bytes 字节
bytearray 字节数组
2.字符编码架构
字符集:是多个字符的集合,用于建立字符到字节的映射。常见字符集名称:ASCII字符集、Unicode字符集等
编码 Encoding: 转换字符到原始字节形式
解码 Decoding: 依据编码名称转换原始字节到字符的过程
3.字符串存储
编码只作用于文件存储或中间媒介转换时
内存中总是存储解码后的文本
2.2字符编码
1.ASCII码
存储在一个Byte 0-127
2.lantin-1
存储在一个Byte 128-255
3.UTF-8
可变字节:
0-128 使用单字节
128-2047 双字节存储
> 2047 3-4Byte
4.UTF-16
2Byte存储字符(另外2Byte作为标识)
5.UTF-32
4Byte存储字符
2.3 内置函数
ord() 获取字符代码点
chr() 获取代码点对应字符
>>> ord('A')
65
>>> chr(68)
'D'
>>> chr(255)
'ÿ'
str1.encode('编码类型') 将特定字符编码
bytes.decode('编码类型') 将字符编码解码为字符文本
>>> s1 = 'ABCD'
>>> s1.encode('ASCII')
b'ABCD'
>>> S2 = '你好啊'
>>> S2.encode('UTF-8')
b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a'
>>> S2.encode('UTF-16')
b'\xff\xfe`O}YJU'
>>> b1 = b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a'
>>> b1.decode('utf-8')
'你好啊'
2.4 类型转换
1.bytes
手动声明:‘b’
>>> b1 = b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a'
>>> b1.decode('utf-8')
'你好啊'
字符串编码:str.encode()
>>> S2 = '你好啊'
>>> S2.encode('UTF-8')
b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a'
构造函数 bytes()
>>> be = bytes('ABCD','ascii')
>>> be[0] = 99 #不支持原位改变
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'bytes' object does not support item assignment
2.bytearray
bytearray(字符,编码)
decode() 解码为字符串
>>> ba = bytearray(s1,'utf8')
>>> ba
bytearray(b'ABCD')
>>> ba[0] = 98 #支持原位改变
>>> ba
bytearray(b'bBCD')
2.5 BOM处理
open('data.txt','w|r',encoding = 'utf-8-sig')
>>> open('data3.txt','w',encoding = 'utf-8-sig').write('hello man')
9
>>> open('data3.txt','r',encoding = 'utf-8-sig').read() #不读取字节标记顺序
'hello man'