首页Python【Python计算生态】T...

【Python计算生态】Tablib——表格数据集库

Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。

本系列将会陆续整理分享一些有趣、有用的第三方库。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_Ecosystem





01
简介

tablib是一个用于处理表格数据的Python第三方库,支持数据的导入、导出和操作。它简化了与常见格式(如CSV、Excel、JSON、YAML等)的数据交互,适合处理数据转换、导出报表等任务。
直接使用pip安装:
pip install tablib
还可以选择安装更多依赖项,以获得更多可用的导入/导出格式。也可以直接安装所有依赖项:

pip install "tablib[all]"
# 等价于
pip install "tablib[html, pandas, ods, xls, xlsx, yaml]"
GitHub页面:
https://github.com/jazzband/tablib

02
基本使用

  • 创建数据集:
tablib.Dataset 是 tablib 的核心类,用于表示和操作表格数据。可以创建一个空的数据集,也可以在创建时指定表头和数据。

import tablib

# 创建一个空的数据集
data = tablib.Dataset()

# 通过 Dataset.headers 添加表头
headers = ('Name''Country')
data.headers = headers

# 通过 Dataset.append 添加数据行
data.append(['Alice''USA'])
data.append(['Bob''Canada'])

# 通过 Dataset.append_col 添加数据行
data.append_col([25, 39], header='Age')

print(data)
#  输出:
#  Name |Country|Age
#  -----|-------|---
#  Alice|USA    |25 
#  Bob  |Canada |39 

# 通过 Dataset.dict 获取数据集的 Pythonic 视图
data.dict
#  输出:[{'Name': 'Alice', 'Country': 'USA', 'Age': 25},
#        {'Name': 'Bob', 'Country': 'Canada', 'Age': 39}]


  • 数据导入:

tablib 支持从多种格式的文件中导入数据,tablib 会检测传入的数据类型,并使用适当的格式来进行导入。 因此,可以从各种不同的文件类型中导入数据。

以下是从 CSV 文件导入数据的示例:


import tablib

# 从 CSV 文件导入数据
with open('data.csv''r') as fh:
    imported_data = tablib.Dataset().load(fh, format='csv', headers=False)

print(imported_data)
#  输出:姓名|年龄|性别
#       张三|25|男 
#       杨慧|28|女 


  • 数据导出:
Tablib 的杀手级特性是能够将 Dataset 对象导出为多种格,如 CSV、JSON、Excel 等。

# 逗号分隔值(CSV)
print(data.export('csv'))

# JavaScript 对象表示法(JSON)
print(data.export('json'))

# YAML(YAML 不是标记语言)
print(data.export('yaml'))

# Microsoft Excel
print(data.export('xls'))

# Pandas DataFrame
print(data.export('df'))


  • 数据操作:
可以对数据集进行一些基本的操作,如切片、过滤等。
  • 选择行和列:
可以像操作标准 Python 列表一样对数据进行切片和操作。

# 切片:第一行
data[0]

# 切片:前两行
data[0:2]

# 索引直接访问某一行
data.get(0)

# 查看列名
# data.headers
# 通过列名获取某列值
data['Name']

# 通过索引访问列
data.get_col(1)

# 简单计算
ages = data['Age']
float(sum(ages)) / len(ages)
  • 删除行和列:


# 删除一列
del data['Age']
# 删除一系列行
del data[0:2]


03
高级用法

  • 动态列:

动态列是一个可调用对象(例如一个函数)。当添加一个动态列时,传递给可调用对象的第一个参数是当前数据行,可以利用它对数据行进行计算。

例如,我们可以使用行中的数据来返回性别。


# 定义函数
def guess_gender(row):
    """根据name计算性别。"""
    m_names = ('Bob''Mike''Yuri')
    f_names = ('Alice''Samantha''Heather')

    # 获取第一列
    name = row[0]

    if name in m_names:
        return'Male'
    elif name in f_names:
        return'Female'
    else:
        return'Unknown'
        
# 将函数作为动态列添加到数据集中
data.append_col(guess_gender, header='Gender')

# 查看数据
data.export('df')
# 输出:  Name Country Age Gender
#      0 Alice  USA    25  Female
#      1 Bob   Canada 39  Male

  • 使用标签过滤数据集:

在构建 Dataset 对象时,可以通过指定 tags 参数为行添加标签,这样就为行添加了额外的元数据,后续可以轻松地过滤 Dataset


students = tablib.Dataset()

students.headers = ['first''last']
# 在构建 Dataset 对象时,通过 tags 参数为行添加标签
students.rpush(['Kenneth''Reitz'], tags=['male''technical'])
students.rpush(['Daniel''Dupont'], tags=['male''creative'])
students.rpush(['Bessie''Monke'], tags=['female''creative'])

# 使用标签过滤数据集
print(students.filter(['female']).dict)
# 输出:[{'first': 'Bessie', 'last': 'Monke'}]

# 默认情况下,当你传递一个标签列表时,你会得到“或”类型的过滤结果。
print(students.filter(['female''creative']).dict)
# 输出:[{'first': 'Daniel', 'last': 'Dupont'}, {'first': 'Bessie', 'last': 'Monke'}]

# 通过链式调用,你可以得到“与”类型的过滤结果
print(students.filter(['female']).filter(['creative']).dict)
# 输出:[{'first': 'Bessie', 'last': 'Monke'}]
  • 操作Excel:

  • 打开 Excel 工作簿并读取第一个工作表:

打开一个 Excel 2007 或更高版本的工作簿,其中包含一个工作表(或者是一个包含多个工作表的工作簿,但只想读取第一个工作表)。


data = tablib.Dataset()
with open('data.xlsx''rb') as fh:
    data.load(fh, 'xlsx')
print(data.dict)
# 输出:[{'姓名': '张三', '年龄': 25, '性别': '男'}, {'姓名': '杨慧', '年龄': 28, '性别': '女'}]
  • 带有多个工作表的 Excel 工作簿:

在处理大量表格格式的数据集(Datasets)将多个电子表格组合到一个 Excel 文件(工作簿,Workbook)中是一种常见操作。tablib 库提供了非常方便的 Databook 类来实现这一功能。

具体来说,假如我们有 3 个不同的 Dataset 对象,只需要将它们添加到一个 Databook 对象中,tablib 就能帮助我们把这些数据集整合到一个 Excel 工作簿里,每个数据集对应工作簿中的一个工作表(Sheet)。


import tablib

# 创建第一个数据集
headers1 = ('Name''Age')
data1 = tablib.Dataset(headers=headers1)
data1.append(('Alice', 25))
data1.append(('Bob', 30))

# 创建第二个数据集
headers2 = ('Fruit''Quantity')
data2 = tablib.Dataset(headers=headers2)
data2.append(('Apple', 10))
data2.append(('Banana', 15))

# 创建第三个数据集
headers3 = ('City''Population')
data3 = tablib.Dataset(headers=headers3)
data3.append(('New York', 8000000))
data3.append(('Los Angeles', 4000000))

# 创建 Databook 对象
databook = tablib.Databook()

# 将数据集添加到 Databook 中
# 可以为每个数据集指定工作表的名称
databook.add_sheet(data1)
databook.add_sheet(data2)
databook.add_sheet(data3)
# 也可以使用下面的方式
# book = tablib.Databook((data1, data2, data3))

# 将 Databook 导出为 Excel 文件
with open('multi_sheet_workbook.xlsx''wb') as f:
    f.write(databook.export('xlsx'))

print("Excel 文件已生成:multi_sheet_workbook.xlsx")
  • 分隔符:

在构建电子表格时,创建一个空白行用于包含即将显示的数据信息通常很有用。

在 tablib 库中,append_separator 方法用于在 Dataset 中添加一个分隔行,分隔行通常用于视觉上分隔不同的数据组。

需要注意的是,目前只有 Excel 输出支持分隔符。


import tablib

# 创建一个数据集并设置表头
headers = ('姓名''年龄''职业')
data = tablib.Dataset(headers=headers)

# 添加分隔行
data.append_separator('第一个分隔行')

# 添加第一组数据
data.append(('张三', 25, '工程师'))
data.append(('李四', 28, '教师'))

# 添加分隔行
data.append_separator('第二个分隔行')

# 添加第二组数据
data.append(('王五', 30, '医生'))
data.append(('赵六', 32, '律师'))

# 将电子表格写入磁盘
with open('output.xlsx''wb') as f:
    f.write(data.export('xlsx'))

保存的excel文件如下:


更多内容可以前往官方文档查看:

https://tablib.readthedocs.io/en/stable/

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments