網站首頁 編程語言 正文
對比其它編程語言,我們都知道Python最大的優勢是代碼簡單,有豐富的第三方開源庫供開發者使用。伴隨著近幾年數據分析的熱度,Python也成為最受歡迎的編程語言之一。而對于數據的讀取和存儲,對于普通人來講,除了數據庫之外,最常見的就是微軟的Excel。
1. 前期準備
1.1. 初識Excel
Microsoft Excel是Microsoft為使用Windows和Apple Macintosh操作系統的電腦編寫的一款電子表格軟件。
1.2. 格式區別
Excel中有xls和xlsx兩種格式,它們之間的區別是:
- 文件格式不同。xls是一個特有的二進制格式,其核心結構是復合文檔類型的結構,而xlsx的核心結構是XML類型的結構,采用的是基于 XML的壓縮方式,使其占用的空間更小。xlsx 中最后一個 x 的意義就在于此。
- 版本不同。xls是Excel2003及以前版本生成的文件格式,而xlsx是Excel2007及以后版本生成的文件格式。
- 兼容性不同。xlsx格式是向下兼容的,可兼容xls格式。
1.3. 庫的使用
Python自帶的模塊中有針對xls格式的xlrd和xlwt模塊,但這兩個庫僅僅是針對xls的操作,當我們要操作xlsx格式文件時,則需要使用到openpyxl第三方庫。
1.4. 整體思路
當使用以上幾個模塊的時候,從理論上我們就可以完全操作不同格式的Excel的讀和寫,很多人就疑惑,那這篇文章的作用是什么?我們直接學習對應的這三個模塊不就好了嗎?
答案就是:雖然這幾個庫已經把Excel的文件、表、行、列的概念完全轉換為Python中的對象,但每次操作都需要遍歷每一個單元格,甚至很多時候我們要花費大量的時間在思考循環單元格的邊界上,這本身就是在重復造輪子,因此我花了半天時間整理了以下六個函數。
2. 代碼展示
2.1. xlz格式
2.1.1. 讀取xls格式文件
def?read_xls_excel(url,index):
????'''
????讀取xls格式文件
????參數:
????????url:文件路徑
??????? index:工作表序號(第幾個工作表,傳入參數從1開始數)
????返回:
????????data:表格中的數據
????'''
????#?打開指定的工作簿
????workbook?=?xlrd.open_workbook(url)
????#?獲取工作簿中的所有表格
????sheets?=?workbook.sheet_names()
????#?獲取工作簿中所有表格中的的第?index?個表格
????worksheet?=?workbook.sheet_by_name(sheets[index-1])
????#?定義列表存儲表格數據
????data?=?[]
????#?遍歷每一行數據
????for?i?in?range(0,?worksheet.nrows):
????????#?定義表格存儲每一行數據
????????da?=?[]
????????#?遍歷每一列數據
????????for?j?in?range(0,?worksheet.ncols):
????????????#?將行數據存儲到da列表
????????????da.append(worksheet.cell_value(i,?j))
????????#?存儲每一行數據
????????data.append(da)
????#?返回數據
????return?data
2.1.2. 寫入xls格式文件
def?write_xls_excel(url,sheet_name,two_dimensional_data):
??'''
????寫入xls格式文件
????參數:
????????url:文件路徑
????????sheet_name:表名
??????? two_dimensional_data:將要寫入表格的數據(二維列表)
????'''
????#?創建工作簿對象
????workbook?=?xlwt.Workbook()
????#?創建工作表對象
????sheet?=?workbook.add_sheet(sheet_name)
????#?遍歷每一行數據
????for?i?in?range(0,len(two_dimensional_data)):
????????#?遍歷每一列數據
????????for?j?in?range(0,len(two_dimensional_data[i])):
????????????#?寫入數據
????????????sheet.write(i,j,two_dimensional_data[i][j])
????#?保存
????workbook.save(url)
????print("寫入成功")
2.1.3. 追加寫入xls格式文件
def?write_xls_excel_add(url,?two_dimensional_data,?index):
????'''
????追加寫入xls格式文件
????參數:
????????url:文件路徑
??????? two_dimensional_data:將要寫入表格的數據(二維列表)
??????? index:指定要追加的表的序號(第幾個工作表,傳入參數從1開始數)
????'''
????#?打開指定的工作簿
????workbook?=?xlrd.open_workbook(url)
????#?獲取工作簿中的所有表格
????sheets?=?workbook.sheet_names()
????#?獲取指定的表
????worksheet?=?workbook.sheet_by_name(sheets[index-1])
????#?獲取表格中已存在的數據的行數
????rows_old?=?worksheet.nrows
????#?將xlrd對象拷貝轉化為xlwt對象
????new_workbook?=?copy(workbook)
????#?獲取轉化后工作簿中的第index個表格
????new_worksheet?=?new_workbook.get_sheet(index-1)
????#?遍歷每一行數據
????for?i?in?range(0,?len(two_dimensional_data)):
????????#?遍歷每一列數據
????????for?j?in?range(0,?len(two_dimensional_data[i])):
????????????#?追加寫入數據,注意是從i+rows_old行開始寫入
????????????new_worksheet.write(i+rows_old,?j,?two_dimensional_data[i][j])
????#?保存工作簿
????new_workbook.save(url)
????print("追加寫入成功")
2.2. xlsx格式
2.2.1. 讀取xlsx格式文件
def?read_xlsx_excel(url,?sheet_name):
????'''
????讀取xlsx格式文件
????參數:
????????url:文件路徑
????????sheet_name:表名
????返回:
????????data:表格中的數據
????'''
????#?使用openpyxl加載指定路徑的Excel文件并得到對應的workbook對象
????workbook?=?openpyxl.load_workbook(url)
????#?根據指定表名獲取表格并得到對應的sheet對象
????sheet?=?workbook[sheet_name]
????#?定義列表存儲表格數據
????data?=?[]
????#?遍歷表格的每一行
????for?row?in?sheet.rows:
????????#?定義表格存儲每一行數據
????????da?=?[]
????????#?從每一行中遍歷每一個單元格
????????for?cell?in?row:
????????????#?將行數據存儲到da列表
????????????da.append(cell.value)
????????#?存儲每一行數據
????????data.append(da)
????#?返回數據
????return?data
2.2.2. 寫入xlsx格式文件
def?write_xlsx_excel(url,?sheet_name,?two_dimensional_data):
????'''
????寫入xlsx格式文件
????參數:
????????url:文件路徑
????????sheet_name:表名
??????? two_dimensional_data:將要寫入表格的數據(二維列表)
????'''
????#?創建工作簿對象
????workbook?=?openpyxl.Workbook()
????#?創建工作表對象
????sheet?=?workbook.active
????#?設置該工作表的名字
????sheet.title?=?sheet_name
????#?遍歷表格的每一行
????for?i?in?range(0,?len(two_dimensional_data)):
????????#?遍歷表格的每一列
????????for?j?in?range(0,?len(two_dimensional_data[i])):
????????????#?寫入數據(注意openpyxl的行和列是從1開始的,和我們平時的認知是一樣的)
????????????sheet.cell(row=i?+?1,?column=j?+?1,?value=str(two_dimensional_data[i][j]))
????#?保存到指定位置
????workbook.save(url)
????print("寫入成功")
2.2.3. 追加寫入xlsx格式文件
def?write_xlsx_excel_add(url,?sheet_name,?two_dimensional_data):
????'''
????追加寫入xlsx格式文件
????參數:
????????url:文件路徑
????????sheet_name:表名
??????? two_dimensional_data:將要寫入表格的數據(二維列表)
????'''
????#?使用openpyxl加載指定路徑的Excel文件并得到對應的workbook對象
????workbook?=?openpyxl.load_workbook(url)
????#?根據指定表名獲取表格并得到對應的sheet對象
????sheet?=?workbook[sheet_name]
????for?tdd?in?two_dimensional_data:
????????sheet.append(tdd)
????#?保存到指定位置
????workbook.save(url)
????print("追加寫入成功")
3. 結果測試
3.1. 讀取測試
先準備兩個Excel文件,如圖所示
其內容如下:
測試代碼:
data1=read_xlsx_excel(r'D:\ii\aa.xlsx',"Sheet1")
data2=read_xlsx_excel(r'D:\ii\bb.xls',1)
for da in data1:
print(da)
print("------------")
for da2 in data1:
print(da2)
輸出結果:
結論:表明讀取并沒有問題!!!接下來測試寫入
3.2. 寫入測試
測試代碼:
uio=[[1,"adsf"],[5,3],[5,"你好"]]
iuo=[[1,2],["adf",3],[5,"你好"]]
wirte_xlsx_excel(r'D:\ii\aa.xlsx',"Sheet1",uio)
wirte_xlsx_excel(r'D:\ii\bb.xls',"Sheet1",iuo)
結果輸出:
看到數據被覆蓋了!!!接下來在上面修改后的數據的基礎上測試追加寫入
3.3. 追加寫入測試
測試代碼:
li=[[1,"add"],[1,"加入"]]
write_xlsx_excel_add(r'D:\ii\bb.xls',li,1)
kk=[[1,"woshilie"],[4,"列"]]
write_xlsx_excel_add(r'D:\ii\aa.xlsx',"Sheet1",kk)
結果輸出:
追加也沒有問題!!
4. 總結
我們一直認為數據分析就應該以數據為主,而不應該把大量的代碼花費在設計Excel表格的樣式上,這樣多少就有點主客顛倒的意思了。
原文鏈接:https://mp.weixin.qq.com/s/PSd-lo2eGvmFAAmIF2PnwQ
相關推薦
- 2022-11-28 go?mod文件內容版本號簡單用法詳解_Golang
- 2023-07-04 ES聚合查詢+條件搜索的實現
- 2022-11-01 Python利用Redis計算經緯度距離案例_python
- 2023-01-26 RecyclerView?源碼淺析測量?布局?繪制?預布局_Android
- 2022-03-07 Go?container包的介紹_Golang
- 2022-05-27 C++?超詳細快速掌握二叉搜索樹_C 語言
- 2022-09-21 python裝飾器底層原理詳解_python
- 2023-02-09 Golang實現Trie(前綴樹)的示例_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支