Python攻克之路-json 和 pickle
Python数据存取
一般的方式
写
[root@python3 day3]# cat test.py #!/usr/local/python3/bin/python3 dic=str({'read':'book'}) f=open('test','w') f.write(dic) [root@python3 day3]# python3 test.py [root@python3 day3]# ll total 8 -rw-r--r-- 1 root root 16 Apr 7 16:01 test -rw-r--r-- 1 root root 90 Apr 7 16:00 test.py [root@python3 day3]# cat test {'read': 'book'}[root@python3 day3]#
读
[root@python3 day3]# cat read.py #!/usr/local/python3/bin/python3 f=open('test','r') data=f.read() print(data['read']) ##文件中的并不是字典,无法这样使用 [root@python3 day3]# python3 read.py Traceback (most recent call last): File "read.py", line 4, in <module> print(data['read']) TypeError: string indices must be integers [root@python3 day3]# cat read.py #!/usr/local/python3/bin/python3 f=open('test','r') data=f.read() print(eval(data)['read']) ##通过eval转换成字典来操作 [root@python3 day3]# python3 read.py book
序列化的引入
描述:我们把对象(变量,如字典,整型,集合等)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling, flattening等等.(使用write写到文本,不能把字典类型存储到磁盘上,所以需要一个序列化)
序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling
json
描述:如果要在不同编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输.json不仅是标准格式,并且比XML更快,而且可以直接在web页面中读取,非常方便.
json表示的对象就是标准的Javascript语言对象,json和python内置的类型对应如下:
json两个方法dumps(加载进去)和load(加载回来)
序列化的过程
a.加载进去:通过转换成json的格式存入到磁盘
[root@python3 test1]# cat json_dumps.py #!/usr/local/python3/bin/python3 import json dic={'name':'reid','age':'20'} data=json.dumps(dic) #转换,json.dumps(要转换的对象) f=open('jsonfile','w') f.write(data) f.close [root@python3 test1]# cat jsonfile {"name": "reid", "age": "20"} ##是json自带的格式,并不了字典
b. 取数据:(通过loads方法把json格式从文本中取出原来对象的类型)
[root@python3 test1]# cat json_loads.py #!/usr/local/python3/bin/python3 import json f=open('jsonfile','r') data=f.read() data=json.loads(data) ##使用loads方法加载回来 print(data['name']) [root@python3 test1]# python3 json_loads.py reid
json的dump和load方法
dump
[root@python3 json_dump_load]# vim json_dump.py #!/usr/local/python3/bin/python3 import json dic={'name':'reid','age':'19'} import json dic={'name':'reid','age':'19'} f=open('json_test','w') #data=json.dumps(dic) ##这两行是做一个序列化,再把结果写入文本 #f.write(data) json.dump(dic,f) #第一个参数是要转入的对象,第二个参数是文件句柄,这行代码相当于上两行 f.close [root@python3 json_dump_load]# python3 json_dump.py [root@python3 json_dump_load]# cat json_test {"name": "reid", "age": "19"}[root@python3 json_dump_load]#
load
[root@python3 json_dump_load]# cat json_load.py #!/usr/local/python3/bin/python3 import json f=open('json_test','r') #data=f.read() #data=json.loads(data) data=json.load(f) #直接写参数f print(data['name']) [root@python3 json_dump_load]# python3 json_load.py reid
pickle的引入
场景:json无法做更高级的转换,如函数和类
[root@python3 function]# cat json_not_fuc.py #!/usr/local/python3/bin/python3 import json def f(): print('function') data=json.dumps(f) ####json转换 [root@python3 function]# python3 json_not_fuc.py Traceback (most recent call last): TypeError: Object of type 'function' is not JSON serializable
使用pickle操作
写入
[root@python3 pickledir]# cat pickletest.py #!/usr/local/python3/bin/python3 import pickle def f(): print('function') data=pickle.dumps(f) filepickle=open('pickle_test','wb') ##写进去的要是字节类型,也就是字串,b是字节,不加默认是写入string filepickle.write(data) filepickle.close() [root@python3 pickledir]# python3 pickletest.py [root@python3 pickledir]# cat pickle_test c__main__ ##pickle的显示方式 f
取出
描述:使用pickle序列化一个函数对象,如函数为f,它指向一块内存地址,生成pickle_test的文本可以传输给其他的电脑使用,但是在其他电脑取出来的是只是一个变量,因为内存地址在原本的电脑上,可能够调用就要两个电脑都有公共的部分函数f
[root@python3 pickledir]# cat pickle_loads.py #!/usr/local/python3/bin/python3 import pickle f=open('pickle_test','rb') data=f.read() data=pickle.loads(data) data() [root@python3 pickledir]# python3 pickle_loads.py Traceback (most recent call last): File "pickle_loads.py", line 6, in <module> data() TypeError: '_io.BufferedReader' object is not callable ##调用时,内存地址已经发生变化
公共的部分加入
[root@python3 pickledir]# cat pickle_loads.py #!/usr/local/python3/bin/python3 import pickle def f(): ## print('function') ## filep=open('pickle_test','rb') data=filep.read() data=pickle.loads(data) data() [root@python3 pickledir]# python3 pickle_loads.py
shelve模块
描述:shelve模块比pickle模块简单,只有 只有一个open函数,返回类似字典的对象,可读可写,key必须为字符串,而值可以是python所支持的数据类型.json和pickle中的方法对于修改上不灵活,而shelve弥补了这点.
存值
[root@python3 shelve]# cat shelve_test.py #!/usr/local/python3/bin/python3 import shelve f=shelve.open('test') #可以加上r,正则中保持原生的字符串,避免一些错误 f['info']={'name':'tom','hobby':'running'} [root@python3 shelve]# ll total 16 -rw-r--r-- 1 root root 115 Apr 7 21:00 shelve_test.py -rw-r--r-- 1 root root 16 Apr 7 21:01 test.bak -rw-r--r-- 1 root root 55 Apr 7 21:01 test.dat -rw-r--r-- 1 root root 16 Apr 7 21:01 test.dir
取值
[root@python3 shelve]# cat shelve_test.py #!/usr/local/python3/bin/python3 import shelve f=shelve.open('test') #f['info']={'name':'tom','hobby':'running'} data=f.get('info') print(data) [root@python3 shelve]# python3 shelve_test.py {'name': 'tom', 'hobby': 'running'}
字典对象中get方法的使用
In [1]: d={'name':'jerry','hobby':'jogging'} In [2]: d['name'] Out[2]: 'jerry' In [3]: d.get('name') ### Out[3]: 'jerry' In [4]: d.get('sex','male') #sex是没有,然后返回一个male Out[4]: 'male'