Python 的 tablib 库在数据格式转换的时候非常方便,比如,我们有一个 json 文件,想转换为 csv 或者 Excel 文件格式。本篇介绍 tablib 库在格式转换中的应用。
tablib 专门设计用于处理表格式数据( tabular dataset)的输入、处理和输出。python 数据处理因为有 pandas 库,一般并不需要 tablib 来做数据处理,但 tablib 库用于输出非常方便,所以在进行数据格式转换的时候,可以用这个库来实现。
项目源代码:https://github.com/jazzband/tablib
项目文档:https://tablib.readthedocs.io/en/stable/
安装
pip install tablib
创建 Dataset 对象
tablib 核心的对象是 Dataset (数据集),我们来看看如何构建 Dataset,示例非常直观:
import tablib
dst = tablib.Dataset(headers=['First Name', 'Last Name', 'Age'])
data = [
('Bruce', 'Lee', 18),
('Alice', 'Brown', 20),
('Alex', 'Gren', 19)
]
for item in data:
dst.append(item)
print(dst)
程序的输出结果:
First Name|Last Name|Age
----------|---------|---
Bruce |Lee |18
Alice |Brown |20
Alex |Gren |19
以上示例演示了通过 append()
方法动态添加行,如果是直接创建 Dataset,代码可以这样写:
import tablib
headers=['First Name', 'Last Name', 'Age']
data = [
('Bruce', 'Lee', 18),
('Alice', 'Brown', 20),
('Alex', 'Gren', 19)
]
dst = tablib.Dataset(*data, headers=headers)
print(dst)
tablib 输出格式
tablib 支持 10 种格式的转换输出,不包含 XML。按 github 说明文件的解释,后续也不会包含 XML 格式。tablib 能够输出的格式包括:
- Excel (Sets + Books)
- JSON (Sets + Books)
- YAML (Sets + Books)
- Pandas DataFrames (Sets)
- HTML (Sets)
- Jira (Sets)
- TSV (Sets)
- ODS (Sets)
- CSV (Sets)
- DBF (Sets)
假设我们想把刚才创建的 Dataset 输出为 json 格式,只需要将最后的 print()
语句改为:
print(dst.json)
程序运行的结果显示:
[{"First Name": "Bruce", "Last Name": "Lee", "Age": 18},
{"First Name": "Alice", "Last Name": "Brown", "Age": 20},
{"First Name": "Alex", "Last Name": "Gren", "Age": 19}]
tablib 负责处理数据格式的转换,如果需要将输出结果输出为文件,还需要搭配 Python 标准库的 open()
函数:
with open('output.json', mode='w',encoding='utf8') as outfile:
outfile.write(dst.json)
以下代码将数据输出为 Excel 文件:
with open('output.xlsx', mode='wb') as outfile:
outfile.write(dst.xlsx)
最后给出一个稍微综合一点的示例,将 Northwind odata service 的 json 数据导入到 Excel文件。
url: https://services.odata.org/V2/Northwind/Northwind.svc/Customers?$format=json
这是一个在线的 odata 服务,我们可以在浏览器中查看。获取 json 格式的数据格式如下:
十几行代码就达到目的:
import requests as req
import tablib
url = 'https://services.odata.org/V2/Northwind/Northwind.svc/Customers?$format=json'
data = req.get(url).json()['d']['results']
ds = tablib.Dataset()
ds.dict = data
# 删除无关列
del ds['__metadata']
del ds['Orders']
del ds['CustomerDemographics']
with open('customers.xlsx', 'wb') as outfile:
outfile.write(ds.xlsx)
pandas 库也能很方便的实现主要数据格式的转换,大家可以根据需要和习惯来选择。
网友评论