ZetCode

Tablib - Python

最后修改日期:2024 年 9 月 24 日

在本文中,我们将介绍如何在 Python 中使用 TOML 配置文件格式。我们使用的是 tomllib 模块,该模块在 Python 3.11 中引入。

tablib 库旨在使处理表格数据(如 CSV、XLSX、JSON 等)更加高效和灵活。它提供了一个统一的接口来处理这些不同的数据格式。

它使我们能够轻松地:

定义数据集

tablib Dataset 是一个 Python 对象,代表一组表格数据。它提供了一种以统一格式存储和操作数据的结构化方式。

main.py
import tablib

ds = tablib.Dataset()

ds.headers = ['first_name', 'last_name', 'occupation']
ds.append(['John', 'Doe', 'gardener' ])
ds.append(['Adam', 'Brown', 'programmer' ])
ds.append(['Tom', 'Holland', 'teacher' ])
ds.append(['Ken', 'Roberts', 'driver' ])

print(ds)
ds.wipe()
print(ds)

示例创建一个简单的数据集。

ds = tablib.Dataset()

我们创建一个空数据集。

ds.headers = ['first_name', 'last_name', 'occupation']

我们为数据集创建了四个标题。

ds.append(['John', 'Doe', 'gardener' ])
ds.append(['Adam', 'Brown', 'programmer' ])
ds.append(['Tom', 'Holland', 'teacher' ])
ds.append(['Ken', 'Roberts', 'driver' ])

使用 append 方法,我们将四行添加到数据集中。

print(ds)

我们打印数据集的内容。

ds.wipe()

wipe 方法会从数据集中移除数据。

$ ./main.py
first_name|last_name|occupation
----------|---------|----------
John      |Doe      |gardener
Adam      |Brown    |programmer
Tom       |Holland  |teacher
Ken       |Roberts  |driver

获取行

我们可以通过索引操作或 get 方法检索行。

main.py
import tablib

ds = tablib.Dataset()

ds.headers = ['first_name', 'last_name', 'occupation']
ds.append(['John', 'Doe', 'gardener' ])
ds.append(['Adam', 'Brown', 'programmer' ])
ds.append(['Tom', 'Holland', 'teacher' ])
ds.append(['Ken', 'Roberts', 'driver' ])

print(ds[0])
print(ds[-1])

print(ds.get(1))
print(ds.get(-2))

示例构建了一个数据集并检索了四行。

$ ./main.py
('John', 'Doe', 'gardener')
('Ken', 'Roberts', 'driver')
('Adam', 'Brown', 'programmer')
('Tom', 'Holland', 'teacher')

获取列

get_col 方法从 Dataset 中返回指定索引的列。

main.py
import tablib

ds = tablib.Dataset()

ds.headers = ['first_name', 'last_name', 'occupation']
ds.append(['John', 'Doe', 'gardener' ])
ds.append(['Adam', 'Brown', 'programmer' ])
ds.append(['Tom', 'Holland', 'teacher' ])
ds.append(['Ken', 'Roberts', 'driver' ])

print(ds.get_col(0))
print(ds.get_col(2))

在示例中,我们打印了第一列和最后一列。

$ ./main.py
['John', 'Adam', 'Tom', 'Ken']
['gardener', 'programmer', 'teacher', 'driver']

添加新列

append_col 会向数据集中添加一列。

main.py
import tablib

ds = tablib.Dataset()

ds.headers = ['first_name', 'last_name', 'occupation']
ds.append(['John', 'Doe', 'gardener' ])
ds.append(['Adam', 'Brown', 'programmer' ])
ds.append(['Tom', 'Holland', 'teacher' ])
ds.append(['Ken', 'Roberts', 'driver' ])

ds.append_col([980, 1230, 2310, 1100], header='salary')

print(ds)

在示例中,我们将新列 salary 添加到数据集中。

$ main.py
first_name|last_name|occupation|salary
----------|---------|----------|------
John      |Doe      |gardener  |980
Adam      |Brown    |programmer|1230
Tom       |Holland  |teacher   |2310
Ken       |Roberts  |driver    |1100

数据排序

sort 函数用于对数据集中的数据进行排序。该函数返回一个新的已排序数据集;原始数据集不会被修改。

import tablib

ds = tablib.Dataset()

ds.headers = ['first_name', 'last_name', 'occupation']
ds.append(['John', 'Doe', 'gardener' ])
ds.append(['Adam', 'Brown', 'programmer' ])
ds.append(['Tom', 'Holland', 'teacher' ])
ds.append(['Ken', 'Roberts', 'driver' ])

ds.append_col([980, 1230, 2310, 1100], header='salary')

sorted_ds = ds.sort('last_name')
print(sorted_ds)

print()

sorted_ds = ds.sort(3, reverse=True)
print(sorted_ds)

示例按姓氏和薪水对数据进行排序。

sorted_ds = ds.sort('last_name')
print(sorted_ds)

我们按 last_name 列对数据进行排序。该函数返回一个新的已排序数据集。

sorted_ds = ds.sort(3, reverse=True)
print(sorted_ds)

我们按薪水降序对数据进行排序。这次我们提供了列索引。

$ ./main.py
first_name|last_name|occupation|salary
----------|---------|----------|------
Adam      |Brown    |programmer|1230
John      |Doe      |gardener  |980
Tom       |Holland  |teacher   |2310
Ken       |Roberts  |driver    |1100

first_name|last_name|occupation|salary
----------|---------|----------|------
Tom       |Holland  |teacher   |2310
Adam      |Brown    |programmer|1230
Ken       |Roberts  |driver    |1100
John      |Doe      |gardener  |980

格式化列

使用 add_formatter,我们可以格式化列。

main.py
import tablib
import datetime

ds = tablib.Dataset()
ds.headers = ['Name', 'Age', 'Height', 'Birthdate']

ds.append(['John Doe', 34, 174.5, datetime.date(1990, 1, 1)])
ds.append(['Roger Roe', 25, 182.7, datetime.date(1995, 5, 15)])

ds.add_formatter('Height', lambda v: f'${v:.2f}')
ds.add_formatter('Birthdate', lambda v: v.strftime('%Y-%m-%d'))
print(ds)

示例格式化了 Height 和 Birthdate 列。

导出数据集

export 方法会将数据集导出为指定格式。支持的格式包括 CSV、YAML、XLSX、JSON 和 Pandas dataframe。

main.py
import tablib

ds = tablib.Dataset()

ds.headers = ['first_name', 'last_name', 'occupation']
ds.append(['John', 'Doe', 'gardener' ])
ds.append(['Adam', 'Brown', 'programmer' ])
ds.append(['Tom', 'Holland', 'teacher' ])
ds.append(['Ken', 'Roberts', 'driver' ])

ds.append_col([980, 1230, 2310, 1100], header='salary')

fname = 'users.csv'

with open(fname, 'w', newline='') as f:
    f.write(ds.export('csv'))

fname = 'users.xlsx'

with open(fname, 'wb') as f:
    f.write(ds.export('xlsx'))

我们将数据集导出为 CSV 和 XLSX 格式。

with open(fname, 'w', newline='') as f:
    f.write(ds.export('csv'))

为了避免出现额外的空行,我们将 CSV 格式的 newline 选项设置为空字符。

with open(fname, 'wb') as f:
    f.write(ds.export('xlsx'))

对于 XLSX 格式,我们以 'wb' 模式打开文件。

load 函数

load 函数将数据加载到数据集中。

main.py
import tablib

ds = tablib.Dataset()

fname = 'users.csv'
with open(fname, 'r') as f:

    ds.load(f)

print(ds)

我们从 users.csv 文件中将行加载到数据集中。

$ ./main.py
first_name|last_name|occupation|salary
----------|---------|----------|------
John      |Doe      |gardener  |980
Adam      |Brown    |programmer|1230
Tom       |Holland  |teacher   |2310
Ken       |Roberts  |driver    |1100

来源

Tablib:Pythonic 表格数据集

在本文中,我们利用 tablib 库在 Python 中处理了表格数据。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Python 教程