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升级提示Tkinter模块找不到的解决方法
Aug 22 Python
Python实现根据IP地址和子网掩码算出网段的方法
Jul 30 Python
Python优化技巧之利用ctypes提高执行速度
Sep 11 Python
Python 正则表达式的高级用法
Dec 04 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
May 03 Python
python使用循环打印所有三位数水仙花数的实例
Nov 13 Python
基于python二叉树的构造和打印例子
Aug 09 Python
浅谈Python中range与Numpy中arange的比较
Mar 11 Python
python argparse传入布尔参数false不生效的解决
Apr 20 Python
python实现数字炸弹游戏
Jul 17 Python
Python 使用dict实现switch的操作
Apr 07 Python
Python实现文本文件拆分写入到多个文本文件的方法
Apr 18 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
phpMyAdmin自动登录和取消自动登录的配置方法
2014/05/12 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
node.js中使用node-schedule实现定时任务实例
2014/06/03 Javascript
JavaScript实现拖拽网页内元素的方法
2015/04/15 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
NodeJS整合银联网关支付(DEMO)
2016/11/09 NodeJs
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
[46:16]2018DOTA2亚洲邀请赛3月30日 小组赛B组 iG VS VP
2018/03/31 DOTA
Python fileinput模块使用介绍
2014/11/30 Python
python base64 decode incorrect padding错误解决方法
2015/01/08 Python
python实现复制整个目录的方法
2015/05/12 Python
python实现SMTP邮件发送功能
2020/06/16 Python
python 打印对象的所有属性值的方法
2016/09/11 Python
python爬虫之百度API调用方法
2017/06/11 Python
flask框架视图函数用法示例
2018/07/19 Python
python+influxdb+shell编写区域网络状况表
2018/07/27 Python
Python中遍历列表的方法总结
2019/06/27 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
Python configparser模块封装及构造配置文件
2020/08/07 Python
python lambda的使用详解
2021/02/26 Python
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
Linux机考试题
2015/10/16 面试题
销售经理岗位职责
2014/03/16 职场文书
建房协议书
2014/04/11 职场文书
杨善洲电影观后感
2015/06/04 职场文书
高中运动会广播稿
2015/08/19 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
SQL Server Agent 服务无法启动
2022/04/20 SQL Server