14 python 中json/pickle/xml模块的使用

1 json

  • json数据是一种只包含双引号的字符串格式,任何对象经过json序列化后单引号也会转成双引号。
import json

dic={'name':'alex'}
print(json.dumps(dic))   #{"name": "alex"}

i=8
print(json.dumps(i))   #8
print(type(json.dumps(i)))  #

s='hello'
print(json.dumps(s))   #"hello"
print(type(json.dumps(s)))  #

l=[11,22]
print(json.dumps(l))   #[11, 22]
  • JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:


    14 python 中json/pickle/xml模块的使用_第1张图片
  • dump()和load()函数

f=open('序列化对象','w')
f.write(j)  #-------------------打开、写入两步等价于json.dump(dic,f)
f.close()
#-----------------------------反序列化
import json f=open('序列化对象') data=json.loads(f.read()) # 打开、读两步等价于data=json.load(f)
  • 无论数据是怎样创建的,只要满足json格式,就可以json.loads出来,不一定非要dumps的数据才能loads

  • json.dumps()中的ensure_ascii=False
    参考资料:https://www.jianshu.com/p/86d66257de41

>>> import json
>>> print json.dumps('中国')     //json.dumps()中的中文默认按ascii编码输出
"\u4e2d\u56fd"

>>> print json.dumps('中国',ensure_ascii=False)   //ensure_ascii=False表示不进行ascii编码
"中国"

2 pickle

  • pickle是python特有的模块,不仅可以将对象序列化,还可以将类、函数等序列化。
  • pickle的用法同json一样,区别是pickle序列化后的结果是字节,而json序列化后的结果是字符串。
  • 使用举例:
import pickle

dic={'name':'lucy','age':18,'sex':'female'}

print(type(dic))    #

seria=pickle.dumps(dic)
print(seria)    ##b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x12X\x04\x00\x00\x00nameq\x02X\x04\x00\x00\x00lucyq\x03X\x03\x00\x00\x00sexq\x04X\x06\x00\x00\x00femaleq\x05u.'
print(type(seria))   #

f=open('pickle序列化对象','wb')   # 注意是w是写入str,wb是写入bytes,seria是'bytes'类型数据
f.write(seria)                # -------------------等价于pickle.dump(dic,f)
f.close()

f=open('pickle序列化对象','rb')
data=pickle.loads(f.read())     #等价于data=pickle.load(f)

print(data['age'])   #18
  • 不建议使用,不同python版本之间可能不兼容

3 shelve模块

import shelve

#打开一个f
f = shelve.open(r'shelve.txt')

#写入数据
f['stu1_info']={'name':'alex','age':'18'}
f['stu2_info']={'name':'alvin','age':'20'}
f['school_info']={'website':'oldboyedu.com','city':'beijing'}

#获取数据
print(f.get('stu1_info')['age'])   #18

#关闭f
f.close()

4 xml模块

作为可以在不同语言和程序之间进行数据交换的数据存储格式,xml比json更古老。
创建一个xmltest.xml文件,里面存储的数据如下:



    
        2
        2008
        141100
        
        
    
    
        5
        2011
        59900
        
    
    
        69
        2011
        13600
        
        
    

  • 数据读取
14 python 中json/pickle/xml模块的使用_第2张图片
  • 修改
import xml.etree.ElementTree as ET

tree=ET.parse("xmltest.xml")      #创建tree解析对象
root=tree.getroot()      #获取根节点

#修改
for node in root.iter('year'):
    new_year=int(node.text) + 1   #找到year的节点,并将值加1
    node.text=str(new_year)   #将int转化成str,并赋值给text
    node.set("update",'yes')  #添加属性update

tree.write("xmltest.xml")   #将修改重新写入xmltest.xml

结果:

14 python 中json/pickle/xml模块的使用_第3张图片
  • 删除node
import xml.etree.ElementTree as ET

tree=ET.parse("xmltest.xml")      #创建tree解析对象
root=tree.getroot()      #获取根节点
#删除node
for country in root.findall('country'):
    rank=int(country.find('rank').text)   #获取rank的值
    if rank > 60:
        root.remove(country)      #删除rank>60的country
tree.write("output.xml")
14 python 中json/pickle/xml模块的使用_第4张图片
  • 代码创建xml
import xml.etree.ElementTree as ET

new_xml = ET.Element("namelist")     #创建根节点为namelist的xml
name = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"})   #添加子节点name
age = ET.SubElement(name, "age", attrib={"checked": "no"})    #添加子节点age
sex = ET.SubElement(name, "sex")     #添加子节点sex
sex.text = '33'    #设置sex的值
name2 = ET.SubElement(new_xml, "name", attrib={"enrolled": "no"})
age = ET.SubElement(name2, "age")
age.text = '19'

et = ET.ElementTree(new_xml)  # 生成文档对象
et.write("test.xml", encoding="utf-8", xml_declaration=True)    #写进xml文件

ET.dump(new_xml)  # 打印生成的格式

生成的数据为:

你可能感兴趣的:(14 python 中json/pickle/xml模块的使用)