在本章和下一章裏,咱們將研究兩種文件類型實例:Excel 文件和 PDF,並給出幾條通常性說明,在遇到其餘文件類型時能夠參考。python
處理 Excel 比上章講的處理 CSV、JSON、XML 文件要難多了,下面以 UNICEF(聯合國兒童基金會) 2014 年的報告爲例,來說解如何處理 Excel 數據。bash
相關文章:工具
十分鐘快速入門 Pythonpost
Python數據處理(一):處理 JSON、XML、CSV 三種格式數據spa
要解析 Excel 文件,須要用第三方的包 xlrd
。咱們用 pip
來安裝第三方包,在命令行輸入如下安裝命令:命令行
pip install xlrd
複製代碼
若是提示 command not found
,則須要先安裝 pip
。安裝方法見 pip 官網:pip.pypa.io/en/stable/i… 。code
想從 Excel 工做表中提取數據,有時最簡單的方式反而是尋找更好的方法來獲取數據。直接解析有時並不能解決問題。因此在解析以前先看看能不能找到其餘格式的數據,好比 CSV、JSON、XML等,若是真找不到再考慮 Excel 解析。cdn
處理 Excel 文件主要有三個庫。對象
xlrd 讀取 Excel 文件。blog
xlwt 向 Excel 文件寫入,並設置格式。
xlutils 一組 Excel 高級操做工具(須要先安裝 xlrd 和 xlwt)。
在用到這三個庫的時候你須要分別安裝。但本章只會用到 xlrd。
下面一步步的講解如何解析 Excel 文件。
先導入 xlrd
庫,而後打開工做簿並保存在 book
變量中。
import xlrd
book = xlrd.open_workbook('./resource/data.xlsx')
複製代碼
與 CSV 不一樣,Excel 工做簿能夠有多個標籤(tab)或工做表(sheet)。想要獲取數據,咱們要找到包含目標數據的工做表。
若是有幾個工做表,你能夠猜一下索引號,但若是工做表不少的話就無法猜了。因此你應該知道 book.sheet_by_name(somename) 命令,其中 somename 是你要訪問工做表的名字。
咱們來看一下工做表都有哪些名字:
import xlrd
book = xlrd.open_workbook('./resource/data.xlsx')
for sheet in book.sheets():
print(sheet.name)
複製代碼
book.sheets()
列出全部的 sheet,sheet.name
打印出 sheet 的名字。輸出:
Data Notes
Table 9
複製代碼
咱們要找的工做表是 Table 9。因此咱們把這個名字添加到腳本中:
import xlrd
book = xlrd.open_workbook('./resource/data.xlsx')
sheet = book.sheet_by_name('Table 9')
print(sheet)
複製代碼
運行會輸出相似這樣的值:
<xlrd.sheet.Sheet object at 0x106af8898>
複製代碼
要查看 sheet 都有什麼方法,能夠用 print(dir(sheet))
。從打印的結果中找到一個 nrows
方法,sheet.nrows
返回這個 sheet 一共有多少行。咱們將用 nrows
來遍歷每一行的內容。
import xlrd
book = xlrd.open_workbook('./resource/data.xlsx')
sheet = book.sheet_by_name('Table 9')
for i in range(sheet.nrows):
print(sheet.row_values(i))
複製代碼
運行程序獲得以下圖的輸出:
取到表格的數據以後,接下來就該想怎麼格式化這些數據,將有用的信息提取出來。提取信息的格式有不少種,這裏咱們用其中一種:
{
u'Afghanistan': {
'child_labor': {
'female': [9.6, ''],
'male': [11.0, ''],
'total': [10.3, '']
},
'child_marriage': {
'married_by_15': [15.0, ''],
'married_by_18': [40.4, '']
}
},
u'Albania': {
'child_labor': {
'female': [9.4, u' '],
'male': [14.4, u' '],
'total': [12.0, u' ']
},
'child_marriage': {
'married_by_15': [0.2, ''],
'married_by_18': [9.6, '']
}
},
...
}
複製代碼
可以讀取 Excel 數據以後,還要從中提取有用的信息,瞭解如何從紛繁複雜的數據提取關鍵數據很重要。
首先最簡單的方法是用軟件打開 Excel 文件直觀的看,以下圖:
咱們上面定義的格式是以國家爲鍵,因此首先應該找到國家。觀察 Excel 表格,從第15 行開始顯示國家數據。Child labour 和 Child marriage 的數據從第E列到第N列。
若是不想用第一種方法,或者電腦上沒有軟件能夠打開文件,能夠嘗試第二種方法:寫代碼屢次試驗。
這個方法用到了計數器原理。先打印前10行,看有沒有想要的數據,若是沒有再打印11-20行,這樣一個區間一個區間的排查,直到肯定準確的行數。
代碼以下:
import xlrd
book = xlrd.open_workbook('./resource/data.xlsx')
sheet = book.sheet_by_name('Table 9')
count = 0
for i in range(sheet.nrows):
if count < 10:
row = sheet.row_values(i)
print(i, row)
count += 1
複製代碼
先打印排查了前10行,查看控制檯輸出沒有找到想要的國家數據,繼續調整試驗:
import xlrd
book = xlrd.open_workbook('./resource/data.xlsx')
sheet = book.sheet_by_name('Table 9')
count = 0
for i in range(10, sheet.nrows):
if count < 10:
row = sheet.row_values(i)
print(i, row)
count += 1
複製代碼
咱們已經知道了前10行沒有想要的數據,因此 range 直接改爲 range(10, sheet.nrows)
從第10行開始打印,其餘代碼不變。再次運行程序,獲得以下輸出:
能夠看到從第14行開始出現了國家名字,這就是咱們要找的數據。
找到想要的數據在第幾行第幾列以後,就能夠按以前定義的格式寫代碼提取組裝數據啦。
import xlrd
import pprint
book = xlrd.open_workbook('./resource/data.xlsx')
sheet = book.sheet_by_name('Table 9')
# 定義存放數據的字典
data = {}
for i in range(14, sheet.nrows):
row = sheet.row_values(i)
# 取出國家名字
country = row[1]
# 按照給定的格式組裝數據
data[country] = {
'child_labor': {
'total': [row[4], row[5]],
'male': [row[6], row[7]],
'female': [row[8], row[9]],
},
'child_marriage': {
'married_by_15': [row[10], row[11]],
'married_by_18': [row[12], row[13]],
}
}
# 最後一個國家是 Zimbabwe,判斷到 Zimbabwe 以後就 break 跳出循環
if country == 'Zimbabwe':
break
# 打印數據
pprint.pprint(data)
複製代碼
打印複雜對象時使用 pprint 格式更美觀。
dir(obj)
來查看,其中 obj 是想要查看相關命令的對象。以上就是用 python 解析 Excel 數據的完整教程。下節會講處理PDF文件,以及用Python解決問題,歡迎關注。