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