一、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. hand first python 选读(2)

    文件读取与异常 文件读取与判断 os模块是调用来处理文件的. 先从最原始的读取txt文件开始吧! 新建一个aaa.txt文档,键入如下英文名篇: Li Lei:"Hello,Han Meim ...

  2. 一个不错的JavaScript解析浏览器路径方法

    JavaScript中有时需要用到当前的请求路径等涉及到url的情况,正常情况下我们可以使用location对象来获取我们需要的信息,本文从另外一个途径来解决这个问题,而且更加巧妙 方法如下: fun ...

  3. IOS-CALayer(图层)

    BWLayer.m // // BWLayer.m // IOS_0222_CALayer // // Created by ma c on 16/2/23. // Copyright © 2016年 ...

  4. 005——数组(五)array_diff_ukey()array_diff_uassoc()array_intersect()array_intersect_assoc()array_intersect_key()array_intersect_ukey()array_intersect_uassoc()

    <?php function dump($arr) { print_r($arr); } /**array_diff_ukey() 通过回调函数的方式,返回一个数组在其他数组中不存在键名的值 * ...

  5. Loadrunner 11检查点使用方法总结

    在使用Loadrunner 11进行性能测试中,有时需要对性能测试中的功能是否全部正确进行判断.这里就需要用到“检查点”,本文总结了常用三种协议下检查点的使用方法,希望阅读本文后的小伙伴们能够掌握其使 ...

  6. C# 设计模式巩固笔记 - 建造者模式

    前言 写给自己-贵在坚持.建造者模式不复杂,但是想个形象的例子好难. 介绍-建造者模式 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 实现 建造者模式主要是应对复杂 ...

  7. 团队项目:"Jarvis For Chat"

    "Jarvis For Chat"项目简介 项目详情信息已经在上一篇博客中详细给出,详请查看博客 团队成员 姓名 学号 张扬(队长) 031602345 苏韫月 031602631 ...

  8. popViewControllerAnimated 后的刷新问题

    popViewControllerAnimated后,进入的viewcontroller不能即时刷新. 这时它不执行viewDidLoad,但执行viewWillAppear:(BOOL),所以只要把 ...

  9. New Concept English three (23)

    31w 45 People become quite illogical when they try to decide what can be eaten and what cannot be ea ...

  10. vue.js 源代码学习笔记 ----- instance inject

    /* @flow */ import { hasSymbol } from 'core/util/env' import { warn } from '../util/index' import { ...