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則在某些特定領域(如文檔處理、傳統企業系統)仍有其優勢。