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编程时利用wxPython来支持多线程的方法
Apr 07 Python
python控制台中实现进度条功能
Nov 10 Python
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
Apr 27 Python
Tornado高并发处理方法实例代码
Jan 15 Python
Python 12306抢火车票脚本
Feb 07 Python
Python BS4库的安装与使用详解
Aug 08 Python
python pygame实现2048游戏
Nov 20 Python
python添加菜单图文讲解
Jun 04 Python
python机器学习库scikit-learn:SVR的基本应用
Jun 26 Python
Django集成celery发送异步邮件实例
Dec 17 Python
教你用python控制安卓手机
May 13 Python
Python如何让字典保持有序排列
Apr 29 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中文件上传的安全问题
2006/10/09 PHP
动态生成gif格式的图像要注意?
2006/10/09 PHP
php 获取select下拉列表框的值
2010/05/08 PHP
PHP版网站缓存加快打开速度的方法分享
2012/06/03 PHP
PHP动态规划解决0-1背包问题实例分析
2015/03/23 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
javascript 学习之旅 (2)
2009/02/05 Javascript
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
随窗体滑动的小插件sticky源码
2013/06/21 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
简介JavaScript中search()方法的使用
2015/06/06 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
Vue.js结合bootstrap实现分页控件
2017/03/10 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
2018/03/15 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
微信网页授权并获取用户信息的方法
2018/07/30 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
2018/08/22 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
vue路由传参的基本实现方式小结【三种方式】
2020/02/05 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
原生js实现随机点名
2020/07/05 Javascript
Vue 事件的$event参数=事件的值案例
2021/01/29 Vue.js
浅谈Python 字符串格式化输出(format/printf)
2016/07/21 Python
Python Socket传输文件示例
2017/01/16 Python
python截取两个单词之间的内容方法
2018/12/25 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
CSS3模拟动画下拉菜单效果
2017/04/12 HTML / CSS
AmazeUI图片轮播效果的示例代码
2020/08/20 HTML / CSS
优秀中专生推荐信
2013/11/17 职场文书
项目合作计划书
2014/01/09 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
2014年祖国生日寄语
2014/09/19 职场文书
导游词之井冈山
2019/11/20 职场文书
深入理解python多线程编程
2021/04/18 Python