手把手教你使用openpyxl庫(kù)從Excel文件中提取指定的數(shù)據(jù)并生成新的文件(附源碼)
回復(fù)“書(shū)籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書(shū)
????大家好,我是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-8from 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.activebuy_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)提取符合條件的行,并遍歷單元格獲取值,以列表形式寫入新表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)不只是這兩種,如果你有其他的方法,可以隨時(shí)分享給我噢!

????小伙伴們,快快用實(shí)踐一下吧!如果在學(xué)習(xí)過(guò)程中,有遇到任何問(wèn)題,歡迎加我好友,我拉你進(jìn)Python學(xué)習(xí)交流群共同探討學(xué)習(xí)。
-------------------?End?-------------------
往期精彩文章推薦:
手把手教你用Pandas庫(kù)對(duì)淘寶原始數(shù)據(jù)進(jìn)行數(shù)據(jù)處理和分詞處理
Python項(xiàng)目實(shí)戰(zhàn)篇——常用驗(yàn)證碼標(biāo)注&識(shí)別(前端+后端實(shí)現(xiàn)高效率數(shù)據(jù)標(biāo)注)

歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群】
萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行
/今日留言主題/
隨便說(shuō)一兩句吧~~
