Python进阶【四】:XML和JSON文件处理
Python提供了多种处理XML和JSON文件的方式,让我们来看看最常用的方法。
一、处理JSON文件
JSON在Python中处理起来非常简单,因为它的结构与Python的字典(dict)和列表(list)几乎一致。
常用模块:json
模块
优点:Python标准库自带,无需安装,使用简单
使用方法示例
1. 读取JSON文件(反序列化)
import json# 从文件读取
with open('data.json', 'r', encoding='utf-8') as f:data = json.load(f) # 返回Python字典或列表# 从字符串读取
json_str = '{"name": "张三", "age": 25, "hobbies": ["篮球", "读书"]}'
data = json.loads(json_str) # 注意是loads(load string)print(data['name']) # 输出: 张三
2. 写入JSON文件(序列化)
import jsondata = {"name": "李四","age": 30,"married": False,"children": None
}# 写入文件
with open('output.json', 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=4) # indent使输出更美观# 转换为JSON字符串
json_str = json.dumps(data, ensure_ascii=False)
print(json_str) # 输出: {"name": "李四", "age": 30, ...}
参数说明:
ensure_ascii=False
:允许非ASCII字符(如中文)直接显示,而不是转成Unicodeindent=4
:缩进4个空格,使JSON更易读
二、处理XML文件
XML处理稍微复杂一些,Python提供了几种不同的解析方式。
常用模块:
xml.etree.ElementTree
(简称ET) - 最常用lxml
- 第三方库,功能更强大xml.dom
- DOM方式解析xml.sax
- SAX方式解析
我们重点介绍最常用的ElementTree
和lxml
1. 使用xml.etree.ElementTree(内置模块)
读取XML文件
import xml.etree.ElementTree as ET# 从文件解析
tree = ET.parse('data.xml') # 解析XML文件
root = tree.getroot() # 获取根元素# 从字符串解析
xml_str = '''
<person><name>王五</name><age>28</age><interests><interest>游泳</interest><interest>编程</interest></interests>
</person>
'''
root = ET.fromstring(xml_str) # 从字符串解析# 遍历XML
print(root.tag) # 输出: person
for child in root:print(child.tag, child.text) # 输出: name 王五, age 28...# 查找特定元素
for interest in root.findall('.//interest'): # 查找所有interest元素print(interest.text) # 输出: 游泳 编程
创建和写入XML文件
import xml.etree.ElementTree as ET# 创建XML结构
person = ET.Element("person")
name = ET.SubElement(person, "name")
name.text = "赵六"
age = ET.SubElement(person, "age")
age.text = "35"# 添加带属性的元素
address = ET.SubElement(person, "address", type="home")
address.text = "北京市海淀区"# 生成XML树并写入文件
tree = ET.ElementTree(person)
tree.write('output.xml', encoding='utf-8', xml_declaration=True)
2. 使用lxml(第三方库,需安装:pip install lxml
)
lxml提供了更强大的XPath支持和更好的性能。
from lxml import etree# 解析XML
tree = etree.parse('data.xml')
root = tree.getroot()# 使用XPath查找
names = root.xpath('//name/text()') # 获取所有name元素的文本
print(names) # 输出: ['王五']# 创建XML
root = etree.Element("school")
class1 = etree.SubElement(root, "class", id="1")
etree.SubElement(class1, "student").text = "小明"
etree.SubElement(class1, "student").text = "小红"# 输出
print(etree.tostring(root, pretty_print=True, encoding='unicode'))
三、JSON vs XML处理对比
操作 | JSON处理方式 | XML处理方式 |
---|---|---|
读取 | json.load() /json.loads() | ET.parse() /ET.fromstring() |
写入 | json.dump() /json.dumps() | ET.ElementTree().write() |
数据结构 | 字典/列表 | 树状结构(元素、属性、文本) |
查询数据 | 直接字典访问data['key'] | find() /findall() /XPath |
创建数据 | 直接构造字典/列表 | 创建Element 和SubElement |
四、如何选择?
- 优先使用JSON:当数据主要用于程序间交换,特别是Web API时
- 使用XML:当需要处理复杂文档结构、需要注释或处理已有XML系统时
记住:对于大多数现代应用,JSON通常是更简单、更高效的选择。XML则在某些特定领域(如文档处理、传统企业系统)仍有其优势。