常用模块(json/pickle/shelve/XML)

一、json模块(重点)

一种跨平台的数据格式

也属于序列化的一种方式

介绍模块之前,三个问题:

序列化是什么?

我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化。

反序列化又是什么?

将硬盘上存储的中间格式数据在还原为内存中的数据结构

为什么要序列化?

1、持久保持状态

2、跨平台数据的交互

JSON是什么? java script object notation 就是对象表示法
var obj = {"name":"egon"}
对于我们开发而言 json就是一种通用的数据格式 任何语言都能解析

js中的数据类型        在python中数据类型的对应关系

{}                           字典
[]                           list
string ""                    str
int/float                 int/float
true/false                True/False
null                         None

json格式的语法规范
最外层通常是一个字典或列表
{} or []
只要你想写一个json格式的数据 那么最外层直接写{}
字符串必须是双引号
你可以在里面套任意多的层次

json模块的核心功能
dump
dumps
load
loads
不带s: 封装了write 和 read

但多数实际开发中 用dumps 和 loads 较多

import json
#序列化
# dic = {"a": ‘香港‘, "b": "重庆", "c": "上海"}
# with open("c.json","wt",encoding="utf-8") as f:
#     f.write(json.dumps(dic))
# print(repr(s), type(s))
反序列化
# with open("c.json","rt",encoding="utf-8") as f:
#     # print(f.read())
#     d = json.loads(f.read())
#     print(d)

两个eg:

jsontext = """{
    "users": [{
            "name": "agon",
            "age": 68
        },
        {
            "name": "alex",
            "age": 57
        }
    ]
}"""

# res = json.loads(jsontext)
# print(res)
mydic = {
    "users": [{
        "name": "agon",
        "age": 68
    },
        {
            "name": "alex",
            "age": 57
        }
    ]
}
# with open("b.json","wt",encoding="utf-8") as f:
#     f.write(json.dumps(mydic))

# with open("b.json", "wt", encoding="utf-8") as f:
#     json.dump(mydic, f)

二、pickle模块

专用于python语言的序列化

pickle模块主要功能
dump
load
dumps
loads
dump是序列化
load反序列化
不带s的是帮你封装write read 更方便

load函数可以多次执行  每次load 都是往后在读一个对象 如果没有了就抛出异常Ran out of input。

eg:

import pickle
# 用户注册后得到的数据
name = "wwl"
password = "123"
height = 1.8
hobby = ["吃","喝","赌","飘",{1,2,3}]

# with open("userdb.txt","wt",encoding="utf-8") as f:
#     text = "|".join([name,password,str(height)])
#     f.write(text)

# pickle支持python中所有的数据类型
user = {"name":name,"password":password,"height":height,"hobby":hobby,"test":3}

序列化的过程

# with open("userdb.pkl","ab") as f:
#     userbytes = pickle.dumps(user)
#     f.write(userbytes)

反序列化过程

# with open("userdb.pkl","rb") as f:
#     userbytes = f.read()
#     user = pickle.loads(userbytes)
#     print(user)
#     print(type(user))
#dump 直接序列化到文件
# with open("userdb.pkl","ab") as f:
#     pickle.dump(user,f)

#load 从文件反序列化
with open("userdb.pkl","rb") as f:
    user = pickle.load(f)
    print(user)
    print(pickle.load(f))
    print(pickle.load(f))
    print(pickle.load(f))

Conclusion:

json vs pickle:

json:

优点:跨语言、体积小

缺点:只能支持int\str\list\tuple\dict

Pickle:

优点:专为python设计,支持python所有的数据类型

缺点:只能在python中使用,存储数据占空间大

三、shelve模块

shelve模块 也用于序列化

它于pickle不同之处在于 不需要关心文件模式什么的 直接把它当成一个字典来看待
它可以直接对数据进行修改 而不用覆盖原来的数据
而pickle 你想要修改只能 用wb模式来覆盖

 序列化

import shelve

f = shelve.open(‘shelve_test‘)  # 打开一个文件

names = ["alex", "rain", "test"]
info = {‘name‘:‘alex‘,‘age‘:22}

f["names"] = names  # 持久化列表
f[‘info_dic‘] = info

f.close()

反序列化

import shelve

d = shelve.open(‘shelve_test‘,,writeback=True)  # 打开一个文件

print(d[‘names‘])
print(d[‘info_dic‘])d[‘names‘].append(‘wwl‘)d.close()

#del d[‘test‘] #还可以删除

四、XML模块 (可扩展的标记语言)

也是一种通用的数据格式
之所用用它也是因为跨平台

xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是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>

重点还是语法格式
一、任何的起始标签都必须有一个结束标签。
<> </>
二、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标
签。这种语法是在于符号之前紧跟一个斜线(/),XML
解析器会将其翻译成<百度百科词条></百度百科词条>。
例如<百度百科词条/>。

三、标签必须按合适的顺序进行行嵌套,所以结束标签必须按镜像顺序匹配
起始标签。这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有
的内部括号之前,是不不能关闭外面的括号的。
四、所有的特性都必须有值。
五、所有的特性都必须在值的周围加上双引号。

一个标签的组成部分
<tagename 属性名称="属性值">文本内容
</tagname>

单标签的写法
<tagename 属性名称="属性值"/>

# 镜像关闭顺序实例

    <a>
        <b>
            <c>
            </c>
        </b>
    </a>
把朋友的信息写成xml
<studentinfo>
    <张三>
        <age>20</age>
        <gender>man</gender>
    </张三>
    <李四>
        <age>20</age>
        <gender>man</gender>
    </李四>
</studentinfo>

用法:

import xml.etree.ElementTree as ElementTree
# 解析d.xml
tree = ElementTree.parse("d.xml")
print(tree)
# 获取根标签
rootTree = tree.getroot()
# 三种获取标签的方式
# 获取所有人的年龄 iter是用于在全文范围获取标签
# for item in rootTree.iter("age"):
#     # 一个标签三个组成部分
#     print(item.tag) # 标签名称
#     print(item.attrib) # 标签的属性
#     print(item.text) # 文本内容

# 第二种 从当前标签的子标签中找到一个名称为age的标签  如果有多个 找到的是第一个
# print(rootTree.find("age").attrib)
# 第三种 从当前标签的子标签中找到所有名称为age的标签
# print(rootTree.findall("age"))
# 获取单个属性
stu = rootTree.find("stu")
print(stu.get("age"))
print(stu.get("name"))

# 删除子标签
rootTree.remove(stu)

# 添加子标签
# 要先创建一个子标签
newTag = ElementTree.Element("这是新标签",{"一个属性":"值"})
rootTree.append(newTag)

# 写入文件
tree.write("f.xml",encoding="utf-8")

练习:

import xml.etree.ElementTree as ElementTree
tree = ElementTree.parse("f.xml")

rootTree = tree.getroot()
users = []
for item in rootTree.iter("stu"):
    user = item.attrib
    print(user)
    gitem = item.find("girlfriend")
    user["girlfriend"] = gitem.attrib
    users.append(user)
print(users)

Conclusion:

xml也是一种中间格式 也属于序列化方式之一
与json相比较
同样的数据 json会比xml 更小 效率更高
xml 需要根据文档结构 手动解析 而 json 直接转对象

原文地址:https://www.cnblogs.com/wanlei/p/9812912.html

时间: 2024-08-11 03:36:29

常用模块(json/pickle/shelve/XML)的相关文章

python 常用模块 time random os模块 sys模块 json &amp; pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess logging re正则 转自老男孩老师Yuan:http://www.cnblogs.com/yuanchenqi/articles/5732581.html 模块&包(* * * * *) 模块(modue)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,

Python全栈开发记录_第八篇(模块收尾工作 json &amp; pickle &amp; shelve &amp; xml)

由于上一篇篇幅较大,留下的这一点内容就想在这里说一下,顺便有个小练习给大家一起玩玩,首先来学习json 和 pickle. 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了,所以eval的重点还是通常用来执行一个字符串表达式,并返回表达式的值. 什么是序列化? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pic

Python学习第十三天 time datetime random os sysshutil json pickle shelve xml configparser hashlib suprocess logging re

https://www.cnblogs.com/yuanchenqi/articles/5732581.html https://www.cnblogs.com/linhaifeng/articles/6384466.html#_label2 一 time与datetime模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行“type(time.time())”,返回的是fl

python开发模块基础:序列化模块json,pickle,shelve

一,为什么要序列化 # 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化'''比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来.但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中.你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢?没错序列化的过程就是从dic 变成str(dic)的

Python常用模块——json,pickle模块

什么是序列化? 序列化是指把内存里的数据类型转变成字符串,使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接收bytes. 为什么要序列化? 我们编写的程序,会涉及到各种各样的对象.数据结构,它们通常是以变量的形式在内存中存在着.当程序运行结束后,这些变量也就会被清理.但我们有时希望能够在下一次编写程序时恢复上一次的某个对象(如机器学习中的到结果,需要程序运行较长时间,多次运行时间成本太大),这就需要我们将变量进行持久化的存储.一种方式是利用文件读写的方式将变量转化为某种形式的字符

Python基础(20)——常用模块sys,os,json,pickle,shelve,xml,re,basedir

纠正上节课的一些错误 __name__  在入口函数中 等于'__main__'   ,在被import导入的情况下等于路径下的自己文件的名字 import os 路径是在lib下面    而sys,time模块不在lib下面,因为他们是C语言实现的内置在解释器里面的,优先级最高 sys.path.append()这个修改路径是临时的修改 ,如果永久修改需要到系统里去设置 环境变量里的系统变量 原文地址:https://www.cnblogs.com/dayouge/p/11158930.htm

保存数据到文件的模块(configparser,json,pickle,shelve,xml)_python

一.各模块的主要功能区别 configparser模块:保存字典内容到文件,并按照一定的格式写入文件保存. shelve模块:将对象写入到文件,保存没有格式,较为轻便. json模块:将对象从内存中完成序列化存储,但是不能对函数和类进行序列化,写入的格式是明文. pickle模块:将对象从内存中完成序列化存储,可以能对函数进行序列化,写入的格式是二进制格式. xml模块:不同语言或程序之间数据交换(较少用) 二.各模块使用例子 1.configparser模块 (1)写入文件 import co

python常用模块——json、pickle、shelve

常用模块 json pickle shelve json模块和pickle模块很像,方法都一样:json在js.python.java等等中通用,而pickle是python里的. 一. json模块 json模块只需要掌握 dumps和loads即可:另外两个用到时再补充吧: 1. dump() 格式如下: dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=N

8.模块介绍 time &amp;datetime模块 random os sys shutil json &amp; picle shelve xml处理 yaml处理 configparser hashlib subprocess logging模块 re正则表达式

本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configparser hashlib subprocess logging模块 re正则表达式 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.p