在本章和下一章裡,我們將研究兩種檔案型別例項:Excel 檔案和 PDF,並給出幾條一般性說明,在遇到其他檔案型別時可以參考。
處理 Excel 比上章講的處理 CSV、JSON、XML 檔案要難多了,下面以 UNICEF(聯合國兒童基金會) 2014 年的報告為例,來講解如何處理 Excel 資料。
相關文章:
Python資料處理(一):處理 JSON、XML、CSV 三種格式資料
一、安裝 Python 包
要解析 Excel 檔案,需要用第三方的包 xlrd
。我們用 pip
來安裝第三方包,在命令列輸入以下安裝命令:
pip install xlrd
複製程式碼
如果提示 command not found
,則需要先安裝 pip
。安裝方法見 pip 官網:pip.pypa.io/en/stable/i… 。
二、解析 Excel 檔案
想從 Excel 工作表中提取資料,有時最簡單的方式反而是尋找更好的方法來獲取資料。直接解析有時並不能解決問題。所以在解析之前先看看能不能找到其他格式的資料,比如 CSV、JSON、XML等,如果真找不到再考慮 Excel 解析。
處理 Excel 檔案主要有三個庫。
-
xlrd 讀取 Excel 檔案。
-
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 檔案直觀的看,如下圖:
我們上面定義的格式是以國家為鍵,所以首先應該找到國家。觀察 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 格式更美觀。
四、總結
- 處理 Excel 的三個庫:xlrd,xlwt,xlutils。根據需要決定用哪些庫。
- 解析出 Excel 之後,通過兩種方法確定想要資料的位置:用圖形化介面開啟直接觀察和通過程式一步步篩選。如果不知道一個物件都有什麼命令,可以列印
dir(obj)
來檢視,其中 obj 是想要檢視相關命令的物件。 - 提前想好最終想輸出的格式,有格式之後組裝資料會比較容易。
- 列印複雜物件時使用 pprint 格式更美觀。
以上就是用 python 解析 Excel 資料的完整教程。下節會講處理PDF檔案,以及用Python解決問題,歡迎關注。