Python之tablib库详细介绍

编程入门 行业动态 更新时间:2024-10-08 08:24:36

Python之tablib库<a href=https://www.elefans.com/category/jswz/34/1760412.html style=详细介绍"/>

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)

这将检测传入的数据类型,并使用适当的格式化程序进行导入。因此,可以从各种不同的文件类型中导入。

当格式为 csvtsvdbfxlsxlsx ,并且数据源没有表头,则应按如下方式导入:

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)[源代码]

    添加给定 DatasetDatabook .

    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库详细介绍

本文发布于:2024-02-13 10:32:14,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1758352.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:详细介绍   Python   tablib

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!