用 Python 讀寫 Excel 表格,就是這麼的簡單粗暴且乏味!

過去,在很多金融、市場、行政的招聘中,面試官都會問一句:“你精通 EXCEL 嗎?”

但今天,他們可能更喜歡問:“你會 Python 嗎?”

越來越多的企業開始用 Python 處理數據,特別是金融、證券、商業、互聯網等領域。 在頂級公司的高端職位中,Python 更是成為了標配:

用 Python 讀寫 Excel 表格,就是這麼的簡單粗暴且乏味!

Python 究竟有什麼法力能讓大家如此青睞?

舉個例子:在過去,如果老闆想要獲取 A 股所有股票近 2 年的數據,你可能需要 查詢-下載-記錄到excel 循環數百次,即使你是一個沒有感情的複製機器人,也需要一兩天的時間。

但如果你掌握了 Python,只需要寫個腳本, 泡杯咖啡的功夫 數據就全部下載好了。再加上 Python 強大的繪圖功能,你可以一次性完成 數據收集 — 整理 — 分析 — 繪圖 的過程,直接把分析結果用圖表呈現出來。

用 Python 讀寫 Excel 表格,就是這麼的簡單粗暴且乏味!


用 Python 讀寫 Excel 表格,就是這麼的簡單粗暴且乏味!

首先,我們來學習一下,如何 用 Python 創建和保存 Excel 文檔。

對於經常與數據打交道的人來說,Excel 是經常使用的工具;對於與數據打交道的程序員來說,OpenPyXL 庫是一個利器。Python 官方提供了這樣一個庫,讓我們可以直接通過 Python 代碼實現對 Excel 文件的操作,操作文件格式包括 xlsx、xlsm、xltx、xltm。

知識點

  • 創建/打開工作簿
  • 訪問工作表單元及其值
  • 保存工作表

讓我們先來學習簡單的創建和保存功能。

創建/打開工作簿

首先,下載實驗所需 shiyanlou.xlsx 示例文件,同時安裝指定版本的 openpyxl 庫。

<code>!wget -nc "https://labfile.oss.aliyuncs.com/courses/1585/shiyanlou.xlsx"
!pip install openpyxl==3.0.3/<code>

使用 openpyxl 不需要在文件系統上創建文件,只需導入 Workbook 類並開始工作:

教學代碼:

<code>from openpyxl import Workbook

wb = Workbook() # 實例化一個工作簿對象

print(wb)/<code>

也可以打開本地已有的工作簿進行實驗操作:

<code>from openpyxl import load_workbook

wb = load_workbook(filename='shiyanlou.xlsx')

print(wb)/<code>

load_workbook 中可以使用以下幾個參數:

<code>data_only
keep_vba/<code>

工作簿創建時總是會默認創建一個名為 Sheet 工作表,可以通過使用 Workbook.active 屬性獲取:

<code>ws = wb.active  # 獲取當前活躍的工作表
print(ws)/<code>

也可以通過 Workbook.create_sheet() 創建工作表並命名,若不設置名字參數則默認命名為 sheet,sheet1,sheet2...創建的工作表位置默認總是插入到最後:

<code>ws = wb.create_sheet() # sheet
ws1 = wb.create_sheet("Mysheet") # 命名為 Mysheet
ws2 = wb.create_sheet("Mysheet1", 0) # 新建 Mysheet1 工作表插入到第一個位置
ws3 = wb.create_sheet("Mysheet2", -1) # 新建 Mysheet2 工作表插入到倒數第二個的位置
ws.title = "shiyanlou" # 將上述 ws 工作表重命名為 shiyanlou

print("Success")/<code>

默認情況下,工作表的標籤背景顏色為白色。我們可以通過 Worksheet.sheet_properties.tabColor 屬性改變顏色:

<code>ws.sheet_properties.tabColor = "1072BA"  # RGB 格式
print(ws.sheet_properties.tabColor)/<code>
用 Python 讀寫 Excel 表格,就是這麼的簡單粗暴且乏味!

我們給工作表取名後,可以把它作為該工作簿的一個鍵,簡化後續代碼,例如:

<code>ws = wb["shiyanlou"]
print(ws)/<code>

若想查看該工作簿下的所有工作表,可以通過函數 Workbook.sheetname :

<code>print(wb.sheetnames)/<code>

也可以通過迭代的方式打印所有工作表

<code>for sheet in wb:
print(sheet.title)/<code>

我們可以通過 Workbook.copy_worksheet() 方法在單個工作簿中創建工作表的副本:

<code>source = wb.active  # 獲取活躍的工作表
target = wb.copy_worksheet(source) # 上述獲取的工作表為其創建副本

print(target)/<code>

訪問工作表單元及其值

前面我們已經知道了如何創建獲取工作簿及工作表,接下來我們將學習修改單元格的內容。以下操作基於 shiyanlou.xlsx 工作簿中的 shiyanlou 工作表進行。單元格可以直接作為工作表的鍵進行訪問賦值,用 value 屬性進行值訪問:

<code>c = ws['A4']  # 將訪問 A4 單元格 

ws['A4'] = 4 # 對 A4 單元格進行賦值

c.value # 訪問 A4 單元格的值,同 ws['A4'].value/<code>

注意:在內存中創建工作表時,它不包含任何單元格,單元格都是在首次訪問時自動創建的。以上代碼也可以通過更簡便的代碼實現:

<code>d = ws.cell(row=4, column=2, value=10)  #  B4 進行賦值

ws['B4'].value # 訪問單元格的值/<code>

訪問多個單元格

可以使用切片訪問範圍為 A1 到 C2 的所有單元格:

<code>cell_range = ws['A1':'C2']

cell_range/<code>

行或列的範圍可以類似地獲得:

<code># 訪問列
colC = ws['C']
col_range = ws['C:D']

# 訪問行
row10 = ws[10]
row_range = ws[5:10]

print(col_range, row_range)/<code>

也可以使用 Worksheet.iter_rows() 返回行:

<code>for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
for cell_row in row:
print(cell_row)/<code>

使用 Worksheet.iter_cols() 返回列:

<code>for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
for cell_col in col:
print(cell_col)/<code>

如果需要遍歷工作表的所有行或列,則可以使用 Worksheet.rows 屬性。出於性能原因,該屬性在只讀模式下不可用:

<code>ws['C9'] = 'hello world'
tuple(ws.rows)/<code>

或者使用 Worksheet.columns 屬性。出於性能原因,該屬性在只讀模式下不可用:

<code>tuple(ws.columns)/<code>

訪問值

如果只需要工作表中的值,則可以使用該 Worksheet.values 屬性。遍歷工作表中的所有行,但僅返回單元格值:

<code>for row in ws.values:
for value in row:
print(value)/<code>

Worksheet.iter_rows() 和 Worksheet.iter_cols() 可以用 values_only 參數,只返回單元格的值:

<code>for row in ws.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True):
print(row)/<code>

保存工作表

將我們之前創建的工作簿保存格式為 xlsx 的文件,若已存在則覆蓋:

<code>wb.save("shiyanlou.xlsx")/<code> 


分享到:


相關文章: