一文帶你玩轉(zhuǎn)Python必備的幾種數(shù)據(jù)格式
前言
在Python開發(fā)中,數(shù)據(jù)格式的選擇直接影響著程序的性能和可維護性。不同的數(shù)據(jù)格式有著各自的特點和適用場景。本文將詳細介紹Python開發(fā)中最常用的幾種數(shù)據(jù)格式,包括它們的特性、使用場景以及相互轉(zhuǎn)換方法,幫助你根據(jù)實際需求選擇最合適的數(shù)據(jù)表示方式。
1. JSON - 輕量級的數(shù)據(jù)交換格式
基本介紹
JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式,易于人閱讀和編寫,也易于機器解析和生成。
Python操作JSON
import json
# Python對象轉(zhuǎn)JSON字符串
data = {"name": "張三", "age": 25, "is_student": True}
json_str = json.dumps(data, ensure_ascii=False) # ensure_ascii=False支持中文
print(json_str) # 輸出: {"name": "張三", "age": 25, "is_student": true}
# JSON字符串轉(zhuǎn)Python對象
python_obj = json.loads(json_str)
print(python_obj["name"]) # 輸出: 張三
# 讀寫JSON文件
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False)
with open('data.json', 'r', encoding='utf-8') as f:
loaded_data = json.load(f)
適用場景
Web API數(shù)據(jù)傳輸
配置文件存儲
不同語言系統(tǒng)間的數(shù)據(jù)交換
2. CSV - 表格數(shù)據(jù)的最佳選擇
基本介紹
CSV(Comma-Separated Values)是以純文本形式存儲表格數(shù)據(jù)的常用格式。
Python操作CSV
import csv
# 寫入CSV文件
data = [
['姓名', '年齡', '城市'],
['張三', '25', '北京'],
['李四', '30', '上海']
]
with open('data.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerows(data)
# 讀取CSV文件
with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row)
# 使用DictReader更友好
with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
print(row['姓名'], row['年齡'])
適用場景
電子表格數(shù)據(jù)導出/導入
數(shù)據(jù)分析的原始數(shù)據(jù)存儲
數(shù)據(jù)庫表數(shù)據(jù)備份
3. XML - 結構化文檔的標準
基本介紹
XML(eXtensible Markup Language)是一種標記語言,用于存儲和傳輸結構化數(shù)據(jù)。
Python操作XML
import xml.etree.ElementTree as ET
# 創(chuàng)建XML
root = ET.Element("catalog")
book1 = ET.SubElement(root, "book", id="1")
ET.SubElement(book1, "title").text = "Python編程"
ET.SubElement(book1, "author").text = "張三"
ET.SubElement(book1, "price").text = "59.00"
tree = ET.ElementTree(root)
tree.write("books.xml", encoding="utf-8", xml_declaration=True)
# 解析XML
tree = ET.parse("books.xml")
root = tree.getroot()
for book in root.findall("book"):
title = book.find("title").text
price = book.find("price").text
print(f"書名: {title}, 價格: {price}")
適用場景
配置文件(如Android的布局文件)
Web服務(如SOAP協(xié)議)
文檔結構存儲(如Office文檔格式)
4. YAML - 人性化的配置文件格式
基本介紹
YAML(YAML Ain’t Markup Language)是一種人性化的數(shù)據(jù)序列化標準,比JSON更易讀。
Python操作YAML
import yaml
# 寫入YAML文件
data = {
'name': '張三',
'age': 25,
'skills': ['Python', 'Java', 'SQL'],
'address': {
'city': '北京',
'postcode': '100000'
}
}
with open('data.yaml', 'w', encoding='utf-8') as f:
yaml.dump(data, f, allow_unicode=True)
# 讀取YAML文件
with open('data.yaml', 'r', encoding='utf-8') as f:
loaded_data = yaml.safe_load(f)
print(loaded_data['name'])
適用場景
應用程序配置文件
持續(xù)集成/部署配置(如GitLab CI)
復雜數(shù)據(jù)結構的序列化
5. Pickle - Python對象的二進制序列化
基本介紹
Pickle是Python特有的數(shù)據(jù)序列化格式,可以將任意Python對象轉(zhuǎn)換為二進制格式。
Python操作Pickle
import pickle
# 序列化對象
data = {'a': [1, 2, 3], 'b': ('string', '另一個字符串'), 'c': None}
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
# 反序列化
with open('data.pkl', 'rb') as f:
loaded_data = pickle.load(f)
print(loaded_data)
注意事項
安全性:不要反序列化不受信任的來源的數(shù)據(jù)
兼容性:不同Python版本間的Pickle文件可能不兼容
適用場景
Python對象的本地持久化
機器學習模型的保存
進程間通信
6. Parquet - 高效的大數(shù)據(jù)列式存儲
基本介紹
Parquet是一種列式存儲格式,特別適合大數(shù)據(jù)處理和分析。
Python操作Parquet
import pandas as pd
import pyarrow.parquet as pq
# 創(chuàng)建示例DataFrame
df = pd.DataFrame({
'name': ['張三', '李四', '王五'],
'age': [25, 30, 35],
'city': ['北京', '上海', '廣州']
})
# 寫入Parquet文件
df.to_parquet('data.parquet')
# 讀取Parquet文件
df_read = pd.read_parquet('data.parquet')
print(df_read.head())
適用場景
大數(shù)據(jù)分析
數(shù)據(jù)倉庫存儲
需要高效查詢的大型數(shù)據(jù)集
7. Protocol Buffers - 高效的二進制序列化格式
基本介紹
Protocol Buffers(protobuf)是Google開發(fā)的高效二進制序列化格式。
Python使用示例
先定義.proto文件:
syntax = "proto3";
message Person {
string name = 1;
int32 age = 2;
repeated string emails = 3;
}
使用protoc編譯:
protoc --python_out=. person.proto
Python中使用:
import person_pb2
# 創(chuàng)建并序列化
person = person_pb2.Person()
person.name = "張三"
person.age = 25
person.emails.append("zhangsan@example.com")
serialized = person.SerializeToString()
# 反序列化
new_person = person_pb2.Person()
new_person.ParseFromString(serialized)
print(new_person.name)
適用場景
高性能網(wǎng)絡通信
微服務間數(shù)據(jù)傳輸
需要版本兼容的數(shù)據(jù)存儲
數(shù)據(jù)格式對比與選擇建議

選擇建議:
需要人類可讀的配置:YAML > JSON > XML
Web API交互:JSON
大數(shù)據(jù)分析:Parquet
Python對象持久化:Pickle
高性能網(wǎng)絡通信:Protobuf
簡單表格數(shù)據(jù):CSV
格式轉(zhuǎn)換技巧
JSON轉(zhuǎn)CSV
import json
import csv
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
# 假設data是列表形式的JSON
with open('output.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=data[0].keys())
writer.writeheader()
writer.writerows(data)
CSV轉(zhuǎn)JSON
import csv
import json
with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
data = [row for row in reader]
with open('output.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
Pandas多格式轉(zhuǎn)換
import pandas as pd
# 讀取各種格式
df_json = pd.read_json('data.json')
df_csv = pd.read_csv('data.csv')
df_parquet = pd.read_parquet('data.parquet')
# 寫入各種格式
df.to_json('output.json', orient='records', force_ascii=False)
df.to_csv('output.csv', index=False)
df.to_parquet('output.parquet')
結語
掌握Python中各種數(shù)據(jù)格式的特點和用法,能夠讓你在開發(fā)過程中根據(jù)具體需求選擇最合適的工具。無論是簡單的配置文件,還是復雜的大數(shù)據(jù)處理,Python生態(tài)都提供了完善的解決方案。
在實際項目中,往往需要根據(jù)性能要求、可讀性需求、團隊習慣等因素綜合考慮選擇哪種數(shù)據(jù)格式。建議多實踐、多比較,積累經(jīng)驗后自然能夠做出最佳選擇。
到此這篇關于一文帶你玩轉(zhuǎn)Python必備的幾種數(shù)據(jù)格式的文章就介紹到這了,更多相關Python數(shù)據(jù)格式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python根據(jù)文章標題內(nèi)容自動生成摘要的實例
今天小編就為大家分享一篇python根據(jù)文章標題內(nèi)容自動生成摘要的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02
python數(shù)據(jù)挖掘Apriori算法實現(xiàn)關聯(lián)分析
這篇文章主要為大家介紹了python數(shù)據(jù)挖掘Apriori算法實現(xiàn)關聯(lián)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
python如何將兩個數(shù)據(jù)表中的對應數(shù)據(jù)相加
這篇文章主要介紹了python如何將兩個數(shù)據(jù)表中的對應數(shù)據(jù)相加問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08

