详细介绍"/>
Python之tablib库详细介绍
介绍
Tablib是一个格式无关的表格数据集库,用Python编写。它允许以pythonical方式导入、导出和操作表格数据集。高级功能包括隔离、动态列、标记/筛选和无缝格式导入/导出。
安装
pip install tablib
还可以选择安装更多的依赖项以获得更多的导入/导出格式:
pip install "tablib[xlsx]"
或所有可能的格式:
pip install "tablib[all]"
相当于:
pip install "tablib[html, pandas, ods, xls, xlsx, yaml]"
快速开始
创建数据集
tablib 的一组数据用 Dataset
表示。
创建 tablib.Dataset
对象
data = tablib.Dataset()
现在可以开始填充这个 Dataset
对象和数据。
添加行
假设你想收集一个简单的名字列表:
# collection of names
names = ['Kenneth Reitz', 'Bessie Monke']for name in names:# split name appropriatelyfname, lname = name.split()# add names to Datasetdata.append([fname, lname])
查看数据集 Dataset.dict
:
>>> data.dict
[('Kenneth', 'Reitz'), ('Bessie', 'Monke')]
添加标题
设置 Dataset.headers
:
data.headers = ['First Name', 'Last Name']
现在数据看起来有点不同了。
>>> data.dict
[{'Last Name': 'Reitz', 'First Name': 'Kenneth'},{'Last Name': 'Monke', 'First Name': 'Bessie'}]
添加列
现在我们有了一个基本的 Dataset
, 对它添加一列 ages :
data.append_col([22, 20], header='Age')
>>> data.dict
[{'Last Name': 'Reitz', 'First Name': 'Kenneth', 'Age': 22},{'Last Name': 'Monke', 'First Name': 'Bessie', 'Age': 20}]
导入数据
通过导入预先存在的文件创建一个 tablib.Dataset
对象:
with open('data.csv', 'r') as fh:imported_data = Dataset().load(fh)
这将检测传入的数据类型,并使用适当的格式化程序进行导入。因此,可以从各种不同的文件类型中导入。
当格式为 csv
, tsv
, dbf
, xls
或 xlsx
,并且数据源没有表头,则应按如下方式导入:
with open('data.csv', 'r') as fh:imported_data = Dataset().load(fh, headers=False)
导出数据
Tablib的杀手级功能是将 Dataset
对象转换为多种格式。
转 csv 格式:
>>> data.export('csv')
Last Name,First Name,Age
Reitz,Kenneth,22
Monke,Bessie,20
转 json 格式:
>>> data.export('json')
[{"Last Name": "Reitz", "First Name": "Kenneth", "Age": 22}, {"Last Name": "Monke", "First Name": "Bessie", "Age": 20}]
转 yaml 格式:
>>> data.export('yaml')
- {Age: 22, First Name: Kenneth, Last Name: Reitz}
- {Age: 20, First Name: Bessie, Last Name: Monke}
转 Microsoft Excel 格式:
>>> data.export('xls')
<redacted binary data>
转 DataFrame 格式:
>>> data.export('df')First Name Last Name Age
0 Kenneth Reitz 22
1 Bessie Monke 21
选择行和列
可以像标准的Python列表一样切片和访问行。
>>> data[0]
('Kenneth', 'Reitz', 22)
通过列名访问列。
>>> data['First Name']
['Kenneth', 'Bessie']
查看列名,通过索引访问列。
>>> data.headers
['Last Name', 'First Name', 'Age']
>>> data.get_col(1)
['Kenneth', 'Bessie']
列的结果以列表形式给出,可进一步对其处理,如计算平均年龄。
>>> ages = data['Age']
>>> float(sum(ages)) / len(ages)
21.0
删除行和列
删除某一列:
>>> del data['Col Name']
按范围删除行:
>>> del data[0:12]
动态列
(0.8.3 新版功能) 动态列是单个可调用对象( e.g. 函数)。
在 Dataset
对象中插入动态列的方法如下,其中函数 random_grade
生成一个随机的分数。
import random
def random_grade(row):return random.randint(60,100)
data.append_col(random_grade, header='Grade')
输出结果:
>>> data.export('df')First Name Last Name Age Grade
0 Kenneth Reitz 22 89
1 Bessie Monke 20 74
添加动态列时,传递给给定可调用项的第一个参数是当前数据行。可以使用此方法对数据行执行计算。
例如,我们可以使用行中可用的数据来猜测学生的性别。
def guess_gender(row):"""Calculates gender of given student data row."""m_names = ('Kenneth', 'Mike', 'Yuri')f_names = ('Bessie', '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')First Name Last Name Age Grade Gender
0 Kenneth Reitz 22 62 Male
1 Bessie Monke 20 100 Female
使用标记筛选数据集
0.9.0 新版功能.
在构造 Dataset
对象时,可以通过指定 tags
参数对 Dataset
进行筛选。这对于基于任意标准分离数据行是有用的。 e.g. 构造以下 Dataset
.
students = tablib.Dataset()students.headers = ['first', 'last']students.rpush(['Kenneth', 'Reitz'], tags=['male', 'technical'])
students.rpush(['Daniel', 'Dupont'], tags=['male', 'creative' ])
students.rpush(['Bessie', 'Monke'], tags=['female', 'creative'])
>>> students.dffirst last
0 Kenneth Reitz
1 Daniel Dupont
2 Bessie Monke
现在在行上有额外的元数据,可以轻松地对数据 Dataset
过滤. 例如查看男学生:
>>> students.filter(['male']).dffirst last
0 Kenneth Reitz
1 Daniel Dupont
默认情况下,当传递标记列表时,将按照逻辑”或“获得过滤数据集。
>>> students.filter(['famale','creative']).dffirst last
0 Daniel Dupont
1 Bessie Monke
按如下方式可以按照逻辑”与“获得过滤数据集。
>>> students.filter('male').filter('creative').json
'[{"first": "Daniel", "last": "Dupont"}]'
以上操作中,原始的 Dataset
没有被更改。
>>> students.dffirst last
0 Kenneth Reitz
1 Daniel Dupont
2 Bessie Monke
打开Excel工作簿并阅读第一张工作表
打开包含单个工作表的 Excel2007 及更高版本的工作簿(或包含多个工作表但只需要第一个工作表的工作簿):
data = tablib.Dataset()
with open('site.xlsx', 'rb') as fh:data.load(fh, 'xlsx')
print(data)
name |site |age
------|-----------------|---
Google|www.google |90
Runoob|www.runoob |40
Taobao|www.taobao |80
Wiki |www.wikipedia|98
保存一张工作表到 Excel 工作簿
with open('class.xlsx', 'wb') as f:f.write(data.export('xlsx'))
保存多张工作表到 Excel 工作簿
在处理大量数据集时,将多个电子表格保存为一个excel文件(称为工作簿)是很常见的。Tablib保存多张工作表的Excel工作簿是相当便利的。
假设有3个数据集 dataset1、dataset2、dataset3
,把它们添加到 Databook
对象,然后进行导出:
book = tablib.Databook((dataset1, dataset2, dataset3))
with open('students.xlsx', 'wb') as f:f.write(book.export('xlsx'))
注:确保以二进制模式打开输出文件。
分离器
0.8.2 新版功能.
在构建电子表格时,通常需要创建一个包含即将到来的数据信息的空行。所以,
daniel_tests = [('11/24/09', 'Math 101 Mid-term Exam', 56.),('05/24/10', 'Math 101 Final Exam', 62.)]suzie_tests = [('11/24/09', 'Math 101 Mid-term Exam', 56.),('05/24/10', 'Math 101 Final Exam', 62.)]# Create new dataset
tests = tablib.Dataset()
tests.headers = ['Date', 'Test Name', 'Grade']# Daniel's Tests
tests.append_separator('Daniel\'s Scores')for test_row in daniel_tests:tests.append(test_row)# Susie's Tests
tests.append_separator('Susie\'s Scores')for test_row in suzie_tests:tests.append(test_row)# Write spreadsheet to disk
with open('grades.xls', 'wb') as f:f.write(tests.export('xls'))
结果 grades.xls 如下:
高级用法API
Dataset
对象
class tablib.Dataset(*args, **kwargs)
[源代码]
Dataset
对象是 tablib 的核心。它提供所有核心功能。通常在主模块中创建一个 Dataset
实例,在收集数据时追加行。
data = tablib.Dataset()
data.headers = ('name', 'age')for (name, age) in some_collector():data.append((name, age))
设置列也是类似的。列数据长度必须等于数据的当前高度,并且必须设置标题。
data = tablib.Dataset()
data.headers = ('first_name', 'last_name')data.append(('John', 'Adams'))
data.append(('George', 'Washington'))data.append_col((90, 67), header='age')
如果处理几十或几百个 Dataset
对象,可以在实例化时设置行和列标题。
headers = ('first_name', 'last_name')
data = [('John', 'Adams'), ('George', 'Washington')]data = tablib.Dataset(*data, headers=headers)
参数
- *args – (可选)要填充数据集的行列表
- headers – (可选)数据集标题行的列表字符串
- title – (可选)用作数据集标题的字符串
add_formatter
(col, handler) [源代码]
将格式化程序添加到 Dataset
(0.9.5 新版功能 )
参数
- col – 接受 index int 或 header str。
- handler – 对每个单元格值执行的回调函数的引用。
append
(row, tags=[])[源代码]
将行添加到 Dataset
. 见 Dataset.insert
其他文件。
append_col
(col, header=None)[源代码]
将列添加到 Dataset
. 见 Dataset.insert_col
其他文件。
append_separator
(text=’-’)[源代码]
添加一个 separator 到 Dataset
.
property dict
本地 python 表示的 Dataset
对象。如果设置了标题,将返回一个python字典列表。如果未设置标题,则将返回元组(行)列表。还可以通过设置数据集来导入数据集对象。 Dataset.dict 属性:
data = tablib.Dataset()
data.dict = [{'age': 90, 'first_name': 'Kenneth', 'last_name': 'Reitz'}]
-
export
(format, **kwargs)[源代码]导出
Dataset
对象到给定格式。参数:**kwargs – (可选)自定义格式配置 export_set .
-
extend
(rows, tags=[])[源代码]将行列表添加到
Dataset
使用Dataset.append
-
filter
(tag)[源代码]返回新实例
Dataset
,只包含给定 tags . -
get_col
(index)[源代码]返回给定索引的
Dataset
。 -
property
headers
(可选)用于标题行和属性名的字符串列表。必须手动设置。给定的列表长度必须等于
Dataset.width
. -
property
height
目前在
Dataset
中不支持直接修改。 -
insert
(index, row, tags=[])[源代码]在
Dataset
给定的索引处插入行。插入的行大小(高度或宽度)必须正确。默认是将给定行插入到Dataset
对象给定的索引处。 -
insert_col
(index, col=None, header=None)[源代码]在
Dataset
给定的索引处插入列。插入的列必须是正确的高度。还可以插入单个可调用对象的列,该列将添加一个新列,每列的返回值都作为列中的项。data.append_col(col=random.randint)
插入列时,如果已设置
Dataset.headers
,则必须设置标题属性,并将其视为该列的标题。见 动态列 。0.9.0 新版功能: 如果插入一行,则可以添加 tags 到要插入的行,如此便于
filter
Dataset
。 -
insert_separator
(index, text=’-’)[源代码]将分隔符添加到
Dataset
在给定索引处。 -
load
(in_stream, format=None, **kwargs)[源代码]使用 format 格式载入 in_stream 到
Dataset
对象。 in_stream 可以是类似文件的对象、字符串或 bytestring。参数****kwargs** – (可选)为自定义格式配置。 -
lpop
()[源代码]删除并返回
Dataset
. -
lpush
(row, tags=[])[源代码]见
Dataset.insert
。 -
lpush_col
(col, header=None)[源代码]将列添加到
Dataset
. 见Dataset.insert
。 -
pop
()[源代码]删除并返回
Dataset
. -
remove_duplicates
()[源代码]从中删除
Dataset
对象所有重复行,同时保持原始顺序。 -
rpop
()[源代码]删除并返回
Dataset
. -
rpush
(row, tags=[])[源代码]见
Dataset.insert
。 -
rpush_col
(col, header=None)[源代码]将列添加到
Dataset
. 见Dataset.insert
。 -
sort
(col, reverse=False)[源代码]在特定列,根据字符串(用于标题)或整数(用于列索引排序)对
Dataset
排序。顺序可以通过设置reverse = True进行反转。 返回对列已排序的
dataset 实例。 -
stack
(other)[源代码]通过在
Dataset
行上联接实例,并返回新的组合实例Dataset
。 -
stack_cols
(other)[源代码]通过在
Dataset
列上联接实例,并返回一个新的组合实例Dataset
。如果任一Dataset
设置了标题,则另一个也必须设置标题。 -
subset
(rows=None, cols=None)[源代码]返回新实例
Dataset
,仅包括指定的行和列。 -
transpose
()[源代码]转置
Dataset
,将行转换为列,反之亦然。返回新的Dataset
实例。原始实例的第一列成为新的标题行。 -
property
width
当前不能直接修改。
wipe
()[源代码]
从 Dataset
对象移除所有实例。
Databook
对象
-
class
tablib.Databook
(sets=None)[源代码]add_sheet
(dataset)[源代码]添加给定
Dataset
到Databook
.export
(format, kwargs)[源代码]以 format 格式导出
Databook
对象 . 参数****kwargs** – (可选)自定义格式配置 .load
(in_stream, format, kwargs)[源代码]使用 format 格式导入 in_stream 到
Databook
对象 . in_stream 可以是类似文件的对象、字符串或bytestring。参数****kwargs** – (可选)自定义格式配置。property size
对
Databook
内的Dataset
对象编号。wipe
()[源代码]移除所有
Databook
中的Dataset
对象。
功能
-
tablib.
detect_format(stream)[源代码]返回给定格式的对象。
-
tablib.
import_set(stream, format=None, **kwargs)[源代码]返回给定格式的数据集。
更多推荐
Python之tablib库详细介绍
发布评论