大型组织和企业经常将数据存储在电子表格中,并需要一个接口将这些数据输入到他们的网络应用中。一般的想法是上传文件,读取其内容,并将其存储在网络应用程序使用的文件或数据库中。组织也可能需要从网络应用程序中导出数据。例如,他们可能需要导出一个班级中所有学生的成绩。同样,电子表格是首选媒介。
在这篇文章中,我们将讨论处理这些文件的不同方法,并使用Python解析它们以获得所需的信息。
快速电子表格入门
在解析电子表格之前,你必须了解它们是如何结构化的。一个电子表格文件是一个工作表的集合,每个工作表是放置在一个网格中的数据单元的集合,类似于一个表格。在一个工作表中,一个数据单元由两个值来识别:它的行号和列号。
例如,在上面的截图中,电子表格只包含一个工作表,"Sheet1"。单元格 "2A "对应的是第二行和第一列。2A单元格的值是1。
尽管带有图形用户界面的程序为列名指定了字母,但当我们解析数据时,我们将从0开始计算行号和列号。这意味着2A单元格将对应于(1,0),4B对应于(1,3),3C对应于(2,2),以此类推。
设置Python环境
我们将使用Python 3来读和写电子表格。为了读写XLSX文件,你需要安装Pandas模块。你可以通过Python安装程序之一来完成:pip
或easy_install
。Pandas使用 openpyxl
模块来读取新的电子表格(.xlsx)文件,和 xlrd
模块来读取传统的电子表格 (.xls 文件)。当你安装Pandas时,这些openpyxl
和xlrd
都是作为依赖项安装的。
pip3 install pandas
要读和写CSV文件,你需要Python预装的csv
模块。你也可以通过 Pandas 读取 CSV 文件。
读取电子表格
如果你有一个文件,并且你想解析其中的数据,你需要按以下顺序执行。
- 导入
pandas
模块 - 打开电子表格文件(或工作簿)。
- 选择一个工作表
- 提取特定数据单元的值
打开一个电子表格文件
让我们首先在 Python 中打开一个文件。为了跟上进度,你可以使用下面这个由Learning Container提供的电子表格样本。
import pandas as pd
workbook = pd.read_excel('sample-xlsx-file-for-testing.xlsx')
workbook.head()
.dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th { vertical-align: top; }
.dataframe thead th { text-align: right; }
段落 | 国家 | 产品 | 折扣率 | 销售单位 | 制造价格 | 销售价格 | 销售总额 | 折扣 | 销售额 | 营运成本 | 利润 | 日期 | 月号 | 月份名称 | 年 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 政府 | 加拿大 | 航线 | 无 | 1618.5 | 3 | 20 | 32370.0 | 0.0 | 32370.0 | 16185.0 | 16185.0 | 2014-01-01 | 1 | 1月 | 2014 |
1 | 政府 | 德国 | 航线 | 无 | 1321.0 | 3 | 20 | 26420.0 | 0.0 | 26420.0 | 13210.0 | 13210.0 | 2014-01-01 | 1 | 1月 | 2014 |
2 | 中型市场 | 法国 | 驾车路线 | 无 | 2178.0 | 3 | 15 | 32670.0 | 0.0 | 32670.0 | 21780.0 | 10890.0 | 2014-06-01 | 6 | 6月 | 2014 |
3 | 中型市场 | 德国 | 航线 | 无 | 888.0 | 3 | 15 | 13320.0 | 0.0 | 13320.0 | 8880.0 | 4440.0 | 2014-06-01 | 6 | 6月 | 2014 |
4 | 中型市场 | 墨西哥 | 航线 | 无 | 2470.0 | 3 | 15 | 37050.0 | 0.0 | 37050.0 | 24700.0 | 12350.0 | 2014-06-01 | 6 | 6月 | 2014 |
Pandas将电子表格作为表格来读取,并将其存储为Pandas数据框。
如果你的文件有非ASCII字符,你应该用unicode格式打开它,如下图。
import sys
workbook = pd.read_excel('sample-xlsx-file-for-testing.xlsx', encoding=sys.getfilesystemencoding())
如果你的电子表格非常大,你可以添加一个参数use_cols
,它只向数据框架加载某些列。例如,下面这个参数将只读取前五列。
workbook = pd.read_excel('~/Desktop/import-export-data.xlsx', usecols = 'A:E')
workbook.head()
.dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th { vertical-align: top; }
.dataframe thead th { text-align: right; }
段落 | 国家 | 产品 | 折扣率 | 销售单位 | |
---|---|---|---|---|---|
0 | 政府 | 加拿大 | 航线 | 无 | 1618.5 |
1 | 政府 | 德国 | 航线 | 无 | 1321.0 |
2 | 中型市场 | 法国 | 喀麦隆 | 无 | 2178.0 |
3 | 中型市场 | 德国 | 驾车出行 | 无 | 888.0 |
4 | 中型市场 | 墨西哥 | 驾车出行 | 无 | 2470.0 |
此外,你可以使用nrows
和skiprows
参数,分别只读取一定数量的行,或在开始时忽略一定数量的行。
继续阅读:在SitePoint上使用Python解析电子表格数据。