快速启动

急于开始?本页介绍了如何开始使用tablib。这假设您已经安装了tablib。如果你不去,就去 Installation 部分。

首先,确保:

让我们从一些简单的用例和示例开始。

创建数据集

A Dataset 只不过是它的名字所暗示的一组数据。

创建自己的 tablib.Dataset 对象很简单。::

data = tablib.Dataset()

你现在可以开始填充这个了 Dataset 对象和数据。

示例上下文

从现在开始,如果你看到 data ,假设它是新的 Dataset 对象。

添加行

假设你想收集一个简单的名字列表。::

# collection of names
names = ['Kenneth Reitz', 'Bessie Monke']

for name in names:
    # split name appropriately
    fname, lname = name.split()

    # add names to Dataset
    data.append([fname, lname])

您可以随时获得数据集的一个漂亮的、Pythic视图。 Dataset.dict ::

>>> data.dict
[('Kenneth', 'Reitz'), ('Bessie', 'Monke')]

添加标题

是时候加强我们的 Dataset 给我们的专栏一些标题。这样做,设置 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 ,并且数据源没有标头,则应按如下方式导入:

打开('数据.csv','r')作为fh:

导入的_data=Dataset().load(fh,headers=False)

导出数据

Tablib的杀手级功能是 Dataset 对象转换为多种格式。

Comma-Separated Values ::

>>> data.export('csv')
Last Name,First Name,Age
Reitz,Kenneth,22
Monke,Bessie,20

对象表示法 ::

>>> 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>

Pandas数据帧 ::

>>> data.export('df')
  First Name Last Name  Age
0    Kenneth     Reitz   22
1     Bessie     Monke   21

选择行和列

可以像标准的Python列表一样切片和骰子数据。::

>>> data[0]
('Kenneth', 'Reitz', 22)
>>> data[0:2]
[('Kenneth', 'Reitz', 22), ('Bessie', 'Monke', 20)]

您还可以使用行的索引来访问行,而无需切片。**

>>> data.get(0)
('Kenneth', 'Reitz', 22)

如果我们有一组由数千行组成的数据,那么在列中获取值列表可能会很有用。为此,我们访问 Dataset 好像它是一个标准的python字典。::

>>> 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]

高级用法

文档服务的这一部分为您提供了一个很难从 API Documentation .

现在是完全不同的事情。

动态列

在 0.8.3 版本加入.

多亏了josh ourisman,tablib现在支持添加动态列。动态列是单个可调用对象( e.g. 函数)。

让我们在 Dataset 对象。在这个例子中,我们有一个函数,它为我们的学生生成一个随机的分数。::

import random

def random_grade(row):
    """Returns a random integer for entry."""
    return (random.randint(60,100)/100.0)

data.append_col(random_grade, header='Grade')

让我们看看我们的数据。::

>>> data.export('yaml')
- {Age: 22, First Name: Kenneth, Grade: 0.6, Last Name: Reitz}
- {Age: 20, First Name: Bessie, Grade: 0.75, Last Name: Monke}

我们把那根柱子去掉。::

>>> del data['Grade']

添加动态列时,传递给给定可调用项的第一个参数是当前数据行。可以使用此方法对数据行执行计算。

例如,我们可以使用行中可用的数据来猜测学生的性别。::

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.export('yaml')
- {Age: 22, First Name: Kenneth, Gender: Male, Last Name: Reitz}
- {Age: 20, First Name: Bessie, Gender: Female, Last Name: Monke}

使用标记筛选数据集

在 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'])

现在我们在行上有额外的元数据,我们可以轻松地过滤我们的数据。 Dataset . 让我们看看女学生。:

>>> students.filter(['female']).yaml
- {first: Bessie, Last: Monke}

默认情况下,当您传递标记列表时,您将获得过滤器类型或。:

>>> students.filter(['female', 'creative']).yaml
- {first: Daniel, Last: Dupont}
- {first: Bessie, Last: Monke}

使用链接可以获得过滤器类型和。:

>>> students.filter(['female']).filter(['creative']).yaml
- {first: Bessie, Last: Monke}

就这么简单。原文 Dataset 是未被触及的。

打开Excel工作簿并阅读第一张工作表

打开包含单个工作表的Excel2007及更高版本的工作簿(或包含多个工作表但只需要第一个工作表的工作簿)。:

data = tablib.Dataset()
with open('my_excel_file.xlsx', 'rb') as fh:
    data.load(fh, 'xlsx')
print(data)

带多张工作表的Excel工作簿

在处理大量 Datasets 在电子表格格式中,将多个电子表格分组为一个excel文件(称为工作簿)是很常见的。Tablib使得使用便利的 Databook 班级。

假设我们有3个不同的 Datasets . 我们要做的就是把它们添加到 Databook 对象…::

book = tablib.Databook((data1, data2, data3))

…导出到excel就像 Datasets . ::

with open('students.xls', 'wb') as f:
    f.write(book.export('xls'))

结果 students.xls 每个文件将包含一个单独的电子表格 Dataset 对象中 Databook .

二进制警告

确保以二进制模式打开输出文件。

分离器

在 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'))

结果 tests.xls 将具有以下布局:

丹尼尔的分数:
  • “11/24/09”,“数学101期中考试”,56.

  • “05/24/10”,“数学101期末考试”,62.

苏西的分数:
  • “11/24/09”,“数学101期中考试”,56.

  • “05/24/10”,“数学101期末考试”,62.

格式支持

此时,只有 Excel 输出支持分隔符。


现在,去看看 API Documentation 或开始 Tablib Development .