python模块--pickle&json&shelve

时间:2023-03-08 16:13:28

使用file文件处理时,写入的必须是str ,否则会报错。

例如:要把一个字典写入文件,写入时会报错 ,就算转换成str格式写入,读取的时候也不能按照dict格式读。

>>> info={
... 'jack':123,
... 'lily':''
... } >>> with open('test.txt','w') as f:
... f.write(info)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
TypeError: write() argument must be str, not dict

序列化

pickle 能够序列化更多的格式,复杂的类型也能处理。例如函数,类等

json 只支持简单类型,如数字,字典,元祖

pickle模块 ( python独有的)

#dumps & loads
# pickle.dumps 将数据转化成只有python认识的字节
>>> p=pickle.dumps(123) #序列化
>>> print(p)
b'\x80\x03K{. >>> pickle.loads(p) #读取,反序列化
123 # dump & load
# pickle.dump 将数据转化成只有python认识的字节,并写入文件
>>> with open('test.txt','wb') as f:
... pickle.dump(info,f)
...
>>> with open('test.txt','rb') as f:
... pickle.load(f)
...
{'jack': 123, 'lily': ''}

json模块 (所有语言都支持)

# dumps & loads
# json.dumps 将数据转化成字符串
>>> import json
>>> import pickle
>>> j = json.dumps(['a','b','c']) #把列表转化成字符串
>>> j
'["a", "b", "c"]'
>>> json.loads(j) #把字符串转化成列表
['a', 'b', 'c'] # dump & load
# json.dump 将数据转化成字符串,并写入文件
>>> with open('test.txt','w') as f:
... json.dump({'user':'lily'},f)
...
>>> with open('test.txt','r') as f:
... json.load(f)
...
{'user': 'lily'}

yaml 模块

把字典写成yml格式的文件:

import yaml
my_dict={'people':{'name':'lily','city':'深圳'}}
with open('info.yml','w') as f:
yaml.dump(my_dict,f,allow_unicode=True) # allow_unicode=True转化成unnicode形式,否则写入文件中文会显示成unicode格式 # cat info.yml
people:
city: 深圳
name: lily

读取yaml格式的文件:

import yaml
with open('info.yml') as f:
data = yaml.load(f)
print(data)
----->
{'people':{'name':'lily','city':'深圳'}}

shelve   -python对象持久化

shelve 通过k,v的格式将内存数据通过文件持久化
              键是普通的字符串。值可以是任意的python对象- 任何pickle模块可以处理的类型

好处:方便多次存数据,随时通过key来取数据,类似字典操作

创建一个shelve:

import shelve
l = ['a','b','c']
d = {"name":"lily","age":22}
s = shelve.open('shelve_test')
s['key_list'] = l
s['key_dict'] = d
s.close() #结果:会生成三个文件 shelve_test.bak,shelve_test.dat ,shelve_test.dir

读取文件内容:

s = shelve.open('shelve_test')
print(s['key_list']) #类似dict取值的方法,如果key不存在会报KeyError
print(s.get('key_dict')) #get()方法,如果key不存在,返回None
s.close()
结果:
['a', 'b', 'c']
{'name': 'lily', 'age': 22} 遍历所有数据:
with shelve.open("shelve_test") as s:
for i in s:
print(i,s[i])

修改shelve已经存在的key的值的数据。 需要加上写回(Writeback=True),否则修改不会生效

s = shelve.open('shelve_test',writeback=True)
s['key_list'].append('defg')
s['key_list'][0] = 'first'
s.close() #再读取
s = shelve.open('shelve_test')
print(s['key_list'])
s.close()
#结果:
['a', 'b', 'c', 'defg']

也可以通过with,防止打开之后忘记关闭close()

with shelve.open("selve_test") as s:
s['key4'] = 444
print(s.get('key4'))
#结果 444