Python數據處理(二):處理 Excel 數據

在本章和下一章里,我們將研究兩種文件類型實例:Excel 文件和 PDF,并給出幾條一般性說明,在遇到其他文件類型時可以參考。

處理 Excel 比上章講的處理 CSV、JSON、XML 文件要難多了,下面以 UNICEF(聯(lián)合國兒童基金會) 2014 年的報告為例,來講解如何處理 Excel 數據。

相關文章:

十分鐘快速入門 Python

Python數據處理(一):處理 JSON、XML、CSV 三種格式數據

一、安裝 Python 包

要解析 Excel 文件,需要用第三方的包 xlrd。我們用 pip 來安裝第三方包,在命令行輸入以下安裝命令:

pip install xlrd

如果提示 command not found ,則需要先安裝 pip 。安裝方法見 pip 官網:https://pip.pypa.io/en/stable/installing/ 。

二、解析 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))

運行程序得到如下圖的輸出:

image

取到表格的數據之后,接下來就該想怎么格式化這些數據,將有用的信息提取出來。提取信息的格式有很多種,這里我們用其中一種:

{
  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 文件直觀的看,如下圖:

image

我們上面定義的格式是以國家為鍵,所以首先應該找到國家。觀察 Excel 表格,從第15 行開始顯示國家數據。Child labour 和 Child marriage 的數據從第E列到第N列。

方法二:用程序多次試驗

如果不想用第一種方法,或者電腦上沒有軟件可以打開文件,可以嘗試第二種方法:寫代碼多次試驗。

這個方法用到了計數器原理。先打印前10行,看有沒有想要的數據,如果沒有再打印11-20行,這樣一個區(qū)間一個區(qū)間的排查,直到確定準確的行數。

代碼如下:

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行,查看控制臺輸出沒有找到想要的國家數據,繼續(xù)調整試驗:

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行開始打印,其他代碼不變。再次運行程序,得到如下輸出:

image

可以看到從第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 跳出循環(huán)
    if country == 'Zimbabwe':
        break

# 打印數據
pprint.pprint(data)

打印復雜對象時使用 pprint 格式更美觀。

四、總結

  1. 處理 Excel 的三個庫:xlrd,xlwt,xlutils。根據需要決定用哪些庫。
  2. 解析出 Excel 之后,通過兩種方法確定想要數據的位置:用圖形化界面打開直接觀察和通過程序一步步篩選。如果不知道一個對象都有什么命令,可以打印 dir(obj) 來查看,其中 obj 是想要查看相關命令的對象。
  3. 提前想好最終想輸出的格式,有格式之后組裝數據會比較容易。
  4. 打印復雜對象時使用 pprint 格式更美觀。

以上就是用 python 解析 Excel 數據的完整教程。下節(jié)會講處理PDF文件,以及用Python解決問題,歡迎關注。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容