手把手教你使用Openpyxl庫從Excel文件中提取指定的數(shù)據(jù)并生成新的文件
大家好,我是Python進階者。
前言
前幾天有個叫【Lcc】的粉絲在Python交流群里問了一道關于從Excel文件中提取指定的數(shù)據(jù)并生成新的文件的問題,初步一看確實有點難,不過還是有思路的。她的目標就是想提取文件中A列單元格中數(shù)據(jù)為10的所有行,看到A列的表頭是時間,10就代表著上午的10小時,也就是說她需要提取每一天中的上午10點鐘的數(shù)據(jù)。這個數(shù)據(jù)在做研究的時候還是挺有用的,之后結合作圖,就可以挖掘出部分潛在規(guī)律了,這個在此不做深究。
一、思路
這個問題看似簡單,直接用Excel中的篩選就可以了。誠然,數(shù)據(jù)篩選,之后擴展行確實可以做到,針對一個或者兩個或者10位數(shù)以下的Excel文件,我們尚且可以游刃有余,但是面對成百上千個這樣的數(shù)據(jù)文件,怕就力不從心了,如果還是挨個進行處理,那就難受了,所以用Python來批量處理還是很奈斯的。下面一起來看看吧!
二、解決方法
其實這個問題和轉載劉早起之前的那篇文章處理思路一模一樣,Python辦公自動化|批量提取Excel數(shù)據(jù),感興趣的話,可以戳鏈接看看,只不過稍微有些改變,把那個判斷條件改為等于就可以了,下面直接上代碼。關于代碼的詳細解析,可以參考上面提到的文章,這里不做贅述。
- # coding: utf-8
- from openpyxl import load_workbook, Workbook
- # 數(shù)據(jù)所在的文件夾目錄
- path = 'C:/Users/pdcfi/Desktop/xiaoluo'
- # 打開數(shù)據(jù)工作簿
- workbook = load_workbook(path + '/' + '巍圖1.xlsx')
- # 打開工作表
- sheet = workbook.active
- buy_mount = sheet['A']
- row_lst = []
- for cell in buy_mount:
- if isinstance(cell.value, int) and cell.value == 10:
- print(cell.row)
- row_lst.append(cell.row)
- new_workbook = Workbook()
- new_sheet = new_workbook.active
- # 創(chuàng)建和原數(shù)據(jù) 一樣的表頭(第一行)
- header = sheet[1]
- header_lst = []
- for cell in header:
- header_lst.append(cell.value)
- new_sheet.append(header_lst)
- # 從舊表中根據(jù)行號提取符合條件的行,并遍歷單元格獲取值,以列表形式寫入新表
- for row in row_lst:
- data_lst = []
- for cell in sheet[row]:
- data_lst.append(cell.value)
- new_sheet.append(data_lst)
- # 最后切記保存
- new_workbook.save(path + '/' + 'xiaoluo_符合篩選條件的新表.xlsx')
之后在本地查看結果,可以看到,符合條件的數(shù)據(jù)全部都被提取出來了。
2)注意
還記得上圖中粉絲說自己提取到的數(shù)據(jù)為啥只有header,而沒有數(shù)據(jù)么?其實這里有個坑,隱藏在她的原始數(shù)據(jù)中,請看下圖。
A列的數(shù)據(jù)是從B列取的,是引用,所有等到訪問的時候,其實是獲取不到的,所有導致我們去讀取的時候,查找的cell為空,自然我們就無法提取到數(shù)據(jù)。
針對這樣的情況,這里給出兩個方案,其一是將A列,復制粘貼,粘貼類型為"值",然后重新保存excel進行讀取就可以搞定了;其二是以B列作為索引,進行時間取值,然后創(chuàng)建新的一列,之后再做提取,實現(xiàn)難度稍微大一些,取時間的代碼可以參考。
- df_raw['時間'] = pd.to_datetime(df_raw['時間'], format='%Y-%m-%d').hour
本文用的是第一種方法,其實第二種方法顯得更加智能一些,難度稍微大一些,實現(xiàn)方法大家可以踴躍的嘗試下。
三、總結
我是Python進階者。本文基于粉絲提問如何從Excel文件中提取指定的數(shù)據(jù)并生成新的文件的問題,給出了兩種解決方案。
針對這個問題,小編這里整理了兩個思路,當然方法肯定遠遠不只是這兩種!