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'