美文网首页
14 python 中json/pickle/xml模块的使用

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

作者: 小码码 | 来源:发表于2018-07-20 17:30 被阅读75次

    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)))  #<class 'str'>
    
    s='hello'
    print(json.dumps(s))   #"hello"
    print(type(json.dumps(s)))  #<class 'str'>
    
    l=[11,22]
    print(json.dumps(l))   #[11, 22]
    
    • JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:


    • dump()和load()函数

    f=open('序列化对象','w')
    f.write(j)  #-------------------打开、写入两步等价于json.dump(dic,f)
    f.close()
    #-----------------------------反序列化<br>
    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))    #<class 'dict'>
    
    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))   #<class 'bytes'>
    
    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文件,里面存储的数据如下:

    <?xml version="1.0"?>
    <data>
        <country name="Liechtenstein">
            <rank updated="yes">2</rank>
            <year>2008</year>
            <gdppc>141100</gdppc>
            <neighbor name="Austria" direction="E"/>
            <neighbor name="Switzerland" direction="W"/>
        </country>
        <country name="Singapore">
            <rank updated="yes">5</rank>
            <year>2011</year>
            <gdppc>59900</gdppc>
            <neighbor name="Malaysia" direction="N"/>
        </country>
        <country name="Panama">
            <rank updated="yes">69</rank>
            <year>2011</year>
            <gdppc>13600</gdppc>
            <neighbor name="Costa Rica" direction="W"/>
            <neighbor name="Colombia" direction="E"/>
        </country>
    </data>
    
    • 数据读取
    • 修改
    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
    

    结果:

    • 删除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")
    
    • 代码创建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模块的使用

          本文链接:https://www.haomeiwen.com/subject/qcvfmftx.html