Python xml、字典、json、类四种数据类型如何实现互相转换


Posted in Python onMay 27, 2020

之前都是直接拿sax,或dom等库去解析xml文件为Python的数据类型再去操作,比较繁琐,如今在写Django网站ajax操作时json的解析,发现这篇帖子对这几种数据类型的转换操作提供了另一种更简洁的方法,xmltodict和 dicttoxml等库功不可没,几种转换方式也都比较全面,转存一下以备不时之需,感谢原创整理!

注:xml、字典、json、类四种数据的转换,从左到右依次转换,即xml要转换为类时,先将xml转换为字典,再将字典转换为json,
最后将json转换为类。

1、解析xml文件:使用iterfind寻找节点,获取子节点方法 list(节点),获取节点属性 get(属性名),下一级节点的值findtext

from xml.etree.ElementTree import parse
try:
  doc=parse('b.xml')
  for item in doc.iterfind('class'):
      classname=item.get('a_name')
      print("classname=",classname)
      for s in list(item):
        name=s.findtext('name')
        age = s.findtext('age')
        sex = s.findtext('sex')
        print("name=",name,"age=",age,"sex=",sex)
      print("-------------------")
except Exception as e:
  print(e)

2、字典转换为xml文件:使用dicttoxml模块,方法:dicttoxml.dicttoxml(字典数据,根节点名称 custom_root='')import dicttoxml

from xml.dom.minidom import parseString
import os
d=[20,'name',
  {'name':'apple','num':10,'price':23},
  {'name': 'pear', 'num': 20, 'price': 18.7},
  {'name': 'banana', 'num': 10.5, 'price': 23}]
bxml=dicttoxml.dicttoxml(d,custom_root='fruit')
xml=bxml.decode('utf-8')
print(xml)
dom=parseString(xml)
pxml=dom.toprettyxml(indent='  ')
f=open('fruits.xml','w',encoding='utf-8')
f.write(pxml)
f.close()

3、xml文件转为字典:使用xmltodict模块 ,方法:xmltodict.parse(xml字符串)

import xmltodict
import pprint
f=open('fruits.xml')
xml=f.read()
d=xmltodict.parse(xml)
pp=pprint.PrettyPrinter(indent=4)
pp.pprint(d)#可以通过d['root']['arg']['#text']来访问节点中的文本值,d['root']['arg']['@p']来访问属性值
f.close()

4、字典转换为json:使用json的dumps方法

import json
data={'name':'bill','company':'huawei','age':30}
jsonstr=json.dumps(data)
print(jsonstr)

5、json转换为字典:使用json模块的loads函数,传入json字符串,返回该字符串对应的字典

d=json.loads(jsonstr)
print(d)

6、json转换为类实例,

1)、在指定的类中必须有一个接受字典的构造函数;或指定回调函数json2Product;

2)、使用json的loads方法(json字符串,object_hook=类名或者回调函数名)

import json
class Product:
  def __init__(self,d):
    self.__dict__=d
def json2Product(d):
  return Product(d)
f=open('products.json','r',encoding='utf-8')
strjson=f.read()
products=json.loads(strjson,object_hook=Product)
for p in products:
  print('name=',p.name,'price=',p.price)

7、 类实例转换为json:1)、指定回调函数(product2Dict)2、使用json的dump函数,指定default参数的回调函数import json

def product2Dict(product):
  return {
    'name': product.name,
    'price': product.price,
    'count': product.count
    }
strJson=json.dumps(products,default=product2Dict)
print(strJson)

8、字典转换为类:1)、将字典转换为json 2)、json转换为类

import json
data=[{"name": "iPhone9", "price": 9999, "count": 3000}, {"name": "tesila", "price": 800000, "count": 122}]
# 将字典转换为json
jsonstr=json.dumps(data)
class Product:
  def __init__(self,d):
    self.__dict__=d
def json2Product(d):
  return Product(d)
# 将json转换为类
ps=json.loads(jsonstr,object_hook=Product)
for p in ps:
  print('name=', p.name, 'price=', p.price)

9、将类转换为字典:1)、类转换为json,使用json的dumps方法 2)、json转为字典,使用json的loads方法

def product2Dict(product):
  return {
    'name': product.name,
    'price': product.price,
    'count': product.count
    }
# 将类转换为json
strJson=json.dumps(ps,default=product2Dict)
print(strJson)
d=json.loads(strJson)
print(d)

10、json转xml 1)、先将xml转换为字典 2)、再使用dicttoxml转换为字典

import json
import dicttoxml
f=open('products.json','r',encoding='utf-8')
jsonstr=f.read()
# 将json转换为字典
d=json.loads(jsonstr)
print(d)
# 将字典转换为xml
bxml=dicttoxml.dicttoxml(d,custom_root='fruit')
print(bxml)

11、将xml转换为json 1)、先使用xmltodict转换为字典2)、再将字典转换为json

import xmltodict
import json
f=open('products.xml','r',encoding='utf-8')
d=f.read()
#先将xml转换为字典
data=xmltodict.parse(d)
print(data)
#再将字典转换为json
strjson=json.dumps(data)
print(strjson)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用xmlrpclib模块实现对百度google的ping功能
Jun 02 Python
浅析Python基础-流程控制
Mar 18 Python
Pycharm学习教程(3) 代码运行调试
May 03 Python
Python入门_条件控制(详解)
May 16 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
Jul 11 Python
Python中static相关知识小结
Jan 02 Python
Python实现邮件的批量发送的示例代码
Jan 23 Python
Python通用循环的构造方法实例分析
Dec 19 Python
对Django外键关系的描述
Jul 26 Python
python3.6 tkinter实现屏保小程序
Jul 30 Python
Python实现打包成库供别的模块调用
Jul 13 Python
Python列表的深复制和浅复制示例详解
Feb 12 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
May 27 #Python
Python列表如何更新值
May 27 #Python
Python模拟伯努利试验和二项分布代码实例
May 27 #Python
基于python纯函数实现井字棋游戏
May 27 #Python
Python实现读取并写入Excel文件过程解析
May 27 #Python
Python正则表达式如何匹配中文
May 27 #Python
使用python创建Excel工作簿及工作表过程图解
May 27 #Python
You might like
php数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
PHP截取IE浏览器并缩小原图的方法
2016/03/04 PHP
PHP实现的堆排序算法详解
2017/08/17 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
asp函数split()对应php函数explode()
2019/02/27 PHP
一个简单的JavaScript 日期计算算法
2009/09/11 Javascript
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
关于jquery.validate1.9.0前台验证的使用介绍
2013/04/26 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
从零学习node.js之利用express搭建简易论坛(七)
2017/02/25 Javascript
angular仿支付宝密码框输入效果
2017/03/25 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
Mac下通过brew安装指定版本的nodejs教程
2018/05/17 NodeJs
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
原生js实现购物车功能
2020/09/23 Javascript
Python库urllib与urllib2主要区别分析
2014/07/13 Python
Python中实现两个字典(dict)合并的方法
2014/09/23 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
python实现一组典型数据格式转换
2018/12/15 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
对Python w和w+权限的区别详解
2019/01/23 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
python实现最小二乘法线性拟合
2019/07/19 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
Python JSON编解码方式原理详解
2020/01/20 Python
python 5个实用的技巧
2020/09/27 Python
基于Canvas+Vue的弹幕组件的实现
2019/07/23 HTML / CSS
台湾母婴用品限时团购:妈咪爱
2018/08/03 全球购物
顶撞领导检讨书
2014/01/29 职场文书
党员教师四风问题对照检查材料
2014/09/26 职场文书
吃空饷专项整治方案
2014/10/27 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书