一、json模块

之前学习过的eval内置方法可以将一个字符串转成一个python对象,不过eval方法时有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了。所以eval的重点还是通常用来执行一个字符串表达式,并返回表达式的值。

 import json
x = "[null,true,false,1]"
# print(eval(x)) #用eval会报错
print(json.loads(x)) # 用json就不会报错

什么是序列化?

我们把对象(变量)从内存种变成可存储或传输的过程称之为序列化,在python种叫picking,在其他语言种也被称之为serialiation,marshalling,flattening,等等,都是一个意思。序列化之后,就可以把徐磊话后的内容写入磁盘,或者通过网络传输到机器上。反过来,把变量内容从徐磊话的对象重新督导内存里称之为反序列化,即unpicking.
json

如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准式,比如XML,但更好的方法是序列化为json,因为json表示出来就是一个字符串,可以被所有语言读取。也可以方便的存储到磁盘或者通过网络传输。json不仅是标准式,并且比XML更快,而且可以直接在web页面种读取,非常方便。

 json表示的对象就是标准的JavaScript语言的对象,json和python内置的书v类型如下:

 JSON                              PYTHON类型
{} dict
[] list
"string" str
1234.56 int或float
true/false Ture/False
null None

json的内部转成

 dic={'name':'alex'}#---->{"name":"alex"}----->'{"name":"alex"}'
i=8 #---->'8'
s='hello' #---->"hello"------>'"hello"'
l=[11,22] #---->"[11,22]"

例1:json和eval的区别

 import json
x = "[null,true,false,1]"
# print(eval(x)) #用eval会报错
print(json.loads(x)) # 用json就不会报错,即eval有局限性

例2:不用json时的读写文件方式

 dic = '{"name":"老王","age":18}'
f = open("hello","w",encoding="utf-8")
f.write(dic)
f.close() # 注意,写完文件后要记得关闭文件
f_read = open("hello","r",encoding="utf-8")
data = f_read.read()
# print(data)
print(type(data))
dat = eval(data)
print(dat)
print(dat["name"])

例3:运用json时的读写方式

 import json
dic = {'name':'老王','age':19}
f = open("new_hello","w",encoding="utf-8")
dic_str = json.dumps(dic) #将字典编译成json格式的字符串,因为json格式的可以进行多种数据传输。即序列化的过程
f.write(dic_str) #写入文件,最后存在文件中的形式都是字符串格式的,已经不是字典了。
f.close()
#json.dump(dic,f) #该句相当于以上两句的效果,平时用上面的比较好。 f_read = open("new_hello","r",encoding="utf-8")
data = json.loads(f_read.read()) #进行反序列化,将json格式的字符串转成普通的字符串
#data = json.load(f_read) #该句相当于以上一句。可以简单化,但是平时用上面的比较多。
print(data)
print(type(data)) #由此可见,反序列化后,又转成了字典形式。
print(data["name"]) #由上一部可以得知,这里可以进行由键取值
 {'name': '老王', 'age': 19}
<class 'dict'>
老王

例4:注意一些细节

 import json
with open("new_hello1","r") as f: #这种读取方式可以命名,如别名 "f",也要有打开方式
data = f.read()
data = json.loads(data)
print(data["name"])

二,pickle模块

pickle
pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于python,并且可能不同版本的python彼此都不兼容,因此,只能用pickle保存那些不重要的数据,不能成功地反序列化也没关系

例:pickle的序列化与反序列化的过程

 dic = {"name":"老王","age":18,"gender":"male"}
import pickle
print(type(dic)) #<class 'dict'> j = pickle.dumps(dic)
print(type(j)) #<class 'bytes'> f = open("序列化_str","wb") #"w"是写入str; "wb"是写入bytes.注意这个细节
f.write(j)
f.close()
#j = picklr.dumps(dic) 和f.write(j) 这两句等价于 pickle.dump(f)
####-----> 以上pickle.dumps() 的过程就相当于 【序列化】 的过程 ####-----> 以下pickle.loads() 就是反序列化的过程
f_read = open("序列化_str","rb")
data = pickle.loads(f_read.read()) #相当于 data = pickle.load(f.read)
print(data["name"])
print(data["age"])
 <class 'dict'>
<class 'bytes'>
老王
18

三,shelve模块

shelve
shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类。

 import shelve
f = shelve.open(r"shelve1.txt") # 此处是将一个字典放入文本 f = {}
f['info1'] = {"name":"老王","age":18,"gender":"male"}
f['info2'] = {"name":"老李","age":20,"gender":"male"}
f['school_info'] = {'website':'www.baidu.com','city':'beijing'}
##---------> 以上这些是写入内容
f.close()
####运行会生成三个文件
f = shelve.open(r"shelve1.txt")
print(f.get('info1')['name']) #读取方法用f.get,读取前要打开文件。打开方式如上

四、XML

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

xml的格式如下,就是通过<>节点来区别数据结构的:

数据代码如下

 <data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year updated="yes">2010</year>
<gdppc>141100</gdppc>
<neighbor direction="E" name="Austria" />
<neighbor direction="W" name="Switzerland" />
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year updated="yes">2013</year>
<gdppc>59900</gdppc>
<neighbor direction="N" name="Malaysia" />
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year updated="yes">2013</year>
<gdppc>13600</gdppc>
<neighbor direction="W" name="Costa Rica" />
<neighbor direction="E" name="Colombia" />
</country>
</data>

注释:属性用来解释标签;属性加在标签的第一个<>里面;xml都是tag属性。

xml协议在各个语言里都是支持的,在python中可以用以下模块操作xml:

 #####--------------------------> XML
import xml.etree.ElementTree as ET # 原名太长,可以起别名,方便下面引用 tree = ET.parse('xml_lesson1') #??
root = tree.getroot() #??
print(root.tag) #打印根节点 for i in root:
# print(i.tag) #打印data下的第一层节点,即三个country
# print(i.attrib) # 打印每个节点的属性,即country,<>内部紧跟country的部分
for j in i:
# print(j.tag) #打印data下的第二层节点,即country下的节点,
# print(j.attrib) # 打印该层每个节点的属性
print(j.text) #打印 每两个<>之间包括的值 ##-------> 遍历xml文档 for child in root:
print(child.tag,child.attrib)
for n in child:
print(n.tag,n.text) ##------> 只遍历year节点
for code in root.iter('year'):
print(code.tag,code.text) ###-------------> 修改
import xml.etree.ElementTree as ET # 原名太长,可以起别名,方便下面引用 tree = ET.parse('xml_lesson1')
root = tree.getroot() ###-------------> 修改
for code in root.iter('year'):
new_year = int(code.text) + 1
code.text = str(new_year)
code.set("updated","yes")
tree.write('xml_lesson') ##--------------> 删除节点
for node in root.findall('country'):
rank = int(node.find('rank').text)
if rank > 5:
root.remove(node)
tree.write('output.xml')
 import  xml.etree.ElementTree as ET   # 原名太长,可以起别名,方便下面引用

 tree = ET.parse('xml_lesson1')   #解析xml,读取数据,摄取数据赋给变量tree,tree即成对象,
# 且是一个实体对象,可以调用一系类方法
#'xml_lesson1 里面存的都是文档树
#data是根对象,下面的country都是节点对象
root = tree.getroot() #获取tree的根节点
print(root.tag) #打印根节点

自己创建xml文档

 ####--------------------------> 自己创建标签语言
import xml.etree.ElementTree as ET
new_xml = ET.Element('namelist')
name = ET.SubElement(new_xml,'name',attrib={'enrolled':'yes'})
age = ET.SubElement(name,'age',attrib={'checked':'no'})
sex = ET.SubElement(name, "sex")
sex.text = ''
name2 = ET.SubElement(new_xml, 'name', attrib={"enrolled": "no"})
age = ET.SubElement(name2, 'age')
age.text = '' et = ET.ElementTree('newx_xml') #生成文档对象
et.write('test.xml',encoding='utf-8',xml_declaration=True)
#ET.dump(new_xml) # 打印生成的格式

python模块--json \ pickle \ shelve \ XML模块的更多相关文章

  1. python 全栈开发,Day25(复习,序列化模块json,pickle,shelve,hashlib模块)

    一.复习 反射 必须会 必须能看懂 必须知道在哪儿用 hasattr getattr setattr delattr内置方法 必须能看懂 能用尽量用__len__ len(obj)的结果依赖于obj. ...

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

    一.json模块(重点) 一种跨平台的数据格式 也属于序列化的一种方式 介绍模块之前,三个问题: 序列化是什么? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化. 反序列化又是什么? 将 ...

  3. 模块 - json/pickle/shelve/xml/configparser

    序列化: 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 为什么要序列化: 有种办法可以直接把内存数据(eg:10个列表,3 ...

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

    python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess ...

  5. Python学习笔记——基础篇【第六周】——json & pickle & shelve & xml处理模块

    json & pickle 模块(序列化) json和pickle都是序列化内存数据到文件 json和pickle的区别是: json是所有语言通用的,但是只能序列化最基本的数据类型(字符串. ...

  6. python 序列化及其相关模块(json,pickle,shelve,xml)详解

    什么是序列化对象? 我们把对象(变量)从内存中编程可存储或传输的过程称之为序列化,在python中称为pickle,其他语言称之为serialization ,marshalling ,flatter ...

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

    由于上一篇篇幅较大,留下的这一点内容就想在这里说一下,顺便有个小练习给大家一起玩玩,首先来学习json 和 pickle. 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过, ...

  8. Python day19 模块介绍3(sys,json,pickle,shelve,xml)

    1.sys模块 import sys sys.path()#打印系统path sys.version()#解释程序版本信息 sys.platform()#系统平台 sys.exit(0)#退出程序 c ...

  9. python笔记-7(shutil/json/pickle/shelve/xml/configparser/hashlib模块)

    一.shutil模块--高级的文件.文件夹.压缩包处理模块 1.通过句柄复制内容 shutil.copyfileobj(f1,f2)对文件的复制(通过句柄fdst/fsrc复制文件内容) 源码: Le ...

随机推荐

  1. mysql数据库优化课程---17、mysql索引优化

    mysql数据库优化课程---17.mysql索引优化 一.总结 一句话总结:一些字段可能会使索引失效,比如like,or等 1.check表监测的使用场景是什么? 视图 视图建立在两个表上, 删除了 ...

  2. nginx页面不能正常访问排除方法

    nginx页面不能访问 nginx页面不能访问 检查服务端服务是否启动成功 在服务端使用wget和curl测试下返回的是否正常 浏览器wget或者curl等软件访问不了Ngixn页面 1. 检查服务端 ...

  3. [洛谷P3811]【模板】乘法逆元

    P3811 [模板]乘法逆元 题意 求1-n所有整数在模p意义下的逆元. 分析 逆元 如果x满足\(ax=1(\%p)\)(其中a p是给定的数)那么称\(x\)是在\(%p\)意义下\(a\)的逆元 ...

  4. Angular开发实践(七): 跨平台操作DOM及渲染器Renderer2

    在<Angular开发实践(六):服务端渲染>这篇文章的最后,我们也提到了在服务端渲染中需要牢记的几件事件,其中就包括不要使用window. document. navigator等浏览器 ...

  5. 【cf 483 div2 -C】Finite or not?(数论)

    链接:http://codeforces.com/contest/984/problem/C 题意 三个数p, q, b, 求p/q在b进制下小数点后是否是有限位. 思路 题意转化为是否q|p*b^x ...

  6. python爬取商品信息

    老严要爬某网购网站的商品信息,正好我最近在学python,就一起写了一个简单的爬虫程序. 需求:某网的商品信息,包括商品名,市场价和售价 工具:python2.7.8,urllib2,re #codi ...

  7. django-pymysql-封装的sql使用

    封装的sql import pymysql def get_list(sql,args): conn = pymysql.connect(host=, user='root', passwd='', ...

  8. 逐步实现hash算法(基于BKDRhash函数)

    哈希(Hash)算法,即散列函数.它是一种单向密码体制,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程.同时,哈希函数可以将任意长度的输入经过变化以后得到固定长度的输出.hash算法 ...

  9. 201621123005《Java程序设计》第三周作业学习总结

    201621123005<Java程序设计>第三周 学习总结 标签(空格分隔): 未分类 1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化 ...

  10. LINUX中的DNS服务---DNS正向、反向和双向解析

    一.DNS的正向解析 也就是域名解析为IP地址进行访问! 1)vim  /etc/named.conf   ---->  删除forwarders所在行 2)vim  /etc/named.rf ...