使用 Python 讀取電子試算表中的資料

2020-04-12 09:35:00

Python 是最流行、功能最強大的程式語言之一。由於它是自由開源的,因此每個人都可以使用。大多數 Fedora 系統都已安裝了該語言。Python 可用於多種任務,其中包括處理逗號分隔值(CSV)資料。CSV檔案一開始往往是以表格或電子試算表的形式出現。本文介紹了如何在 Python 3 中處理 CSV 資料。

CSV 資料正如其名。CSV 檔案按行放置資料,數值之間用逗號分隔。每行由相同的欄位定義。簡短的 CSV 檔案通常易於閱讀和理解。但是較長的資料檔案或具有更多欄位的資料檔案可能很難用肉眼解析,因此在這種情況下計算機做得更好。

這是一個簡單的範例,其中的欄位是 NameEmailCountry。在此例中,CSV 資料將欄位定義作為第一行,儘管並非總是如此。

Name,Email,CountryJohn Q. Smith,[email protected],USAPetr Novak,[email protected],CZBernard Jones,[email protected],UK

從電子試算表讀取 CSV

Python 包含了一個 csv 模組,它可讀取和寫入 CSV 資料。大多數電子試算表應用,無論是原生(例如 Excel 或 Numbers)還是基於 Web 的(例如 Google Sheet),都可以匯出 CSV 資料。實際上,許多其他可發布表格報告的服務也可以匯出為 CSV(例如,PayPal)。

Python csv 模組有一個名為 DictReader 的內建讀取器方法,它可以將每個資料行作為有序字典 (OrderedDict) 處理。它需要一個檔案物件存取 CSV 資料。因此,如果上面的檔案在當前目錄中為 example.csv,那麼以下程式碼段是獲取此資料的一種方法:

f = open('example.csv', 'r')from csv import DictReaderd = DictReader(f)data = []for row in d:    data.append(row)

現在,記憶體中的 data 物件是 OrderedDict 物件的列表:

[OrderedDict([('Name', 'John Q. Smith'),               ('Email', '[email protected]'),               ('Country', 'USA')]),  OrderedDict([('Name', 'Petr Novak'),               ('Email', '[email protected]'),               ('Country', 'CZ')]),  OrderedDict([('Name', 'Bernard Jones'),               ('Email', '[email protected]'),               ('Country', 'UK')])]

參照這些物件很容易:

>>> print(data[0]['Country'])USA>>> print(data[2]['Email'])[email protected]

順便說一句,如果你需要處理沒有欄位名標題行的 CSV 檔案,那麼 DictReader 類可以讓你定義它們。在上面的範例中,新增 fieldnames 引數並傳遞一系列名稱:

d = DictReader(f, fieldnames=['Name', 'Email', 'Country'])

真範例子

我最近想從一長串人員名單中隨機選擇一個中獎者。我從電子試算表中提取的 CSV 資料是一個簡單的名字和郵件地址列表。

幸運的是,Python 有一個有用的 random 模組,可以很好地生成隨機值。該模組 Random 類中的 randrange 函數正是我需要的。你可以給它一個常規的數位範圍(例如整數),以及它們之間的步長值。然後,該函數會生成一個隨機結果,這意味著我可以在資料的總行數範圍內獲得一個隨機整數(或者說是行號)。

這個小程式執行良好:

from csv import DictReaderfrom random import Randomd = DictReader(open('mydata.csv'))data = []for row in d:    data.append(row)r = Random()winner = data[r.randrange(0, len(data), 1)]print('The winner is:', winner['Name'])print('Email address:', winner['Email'])

顯然,這個例子非常簡單。電子試算表本身包含了複雜的分析資料的方法。但是,如果你想在電子試算表應用之外做某事,Python 或許是一種技巧!

題圖由 Isaac Smith 拍攝,發表於 U??nsplash