小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Python辦公自動化|批量提取Excel數(shù)據(jù)

 O聽_海_軒O 2020-08-26

本文是Python辦公自動化系列的第十篇

大家好,又到了Python辦公自動化系列。

今天我們來講解一個比較簡單的案例,使用openpyxl從Excel中提取指定的數(shù)據(jù)并生成新的文件,之后進(jìn)一步批量自動化實現(xiàn)這個功能,通過本例可以學(xué)到的知識點:

  • openpyxl模塊的運用

  • glob模塊建立批處理

數(shù)據(jù)源:阿里云天池的電商嬰兒數(shù)據(jù)(可自行搜索并下載,如果要完成進(jìn)階難度可直接將該數(shù)據(jù)Excel拷貝999次即可,當(dāng)然這個拷貝可以交給代碼來實現(xiàn))

需求說明

初級難度:提取電商嬰兒數(shù)據(jù).xlsx中購買數(shù)buy_mount超過50的記錄建立新的Excel表

最后形成如下的表格:

進(jìn)階難度:同一個文件夾下有1000份電商嬰兒數(shù)據(jù)的Excel表格(命名為電商嬰兒數(shù)據(jù)1.xlsx,電商嬰兒數(shù)據(jù)2.xlsx至電商嬰兒數(shù)據(jù)1000.xlsx),需要提取所有表格中購買數(shù)buy_mount超過50的記錄并匯總至一個新的Excel表

Python實現(xiàn)

讓我們先完成初級難度的需求挑戰(zhàn),首先導(dǎo)入所需模塊并打開數(shù)據(jù)表,注意

打開已經(jīng)存在的Excel用load_workbook,創(chuàng)建新的Excel用Workbook
from openpyxl import load_workbook, Workbook

# 數(shù)據(jù)所在的文件夾目錄
path = 'C:/Users/xxxxxx'

# 打開電商嬰兒數(shù)據(jù)工作簿
workbook = load_workbook(path + '/' + '電商嬰兒數(shù)據(jù).xlsx')
# 打開工作表
sheet = workbook.active

接下來篩選符合條件的行

buy_mount = sheet['F']
row_lst = []
for cell in buy_mount:
    if isinstance(cell.value, int) and cell.value > 50:
        print(cell.row)
        row_lst.append(cell.row)

這一步本質(zhì)上就是對購買數(shù)的各個單元格進(jìn)行判斷,如果數(shù)值超過50就將其行號放入一個空列表中,間接完成了篩出符合條件的行。注意這一列有可能有的單元格cell的值value不是數(shù)值類型,因此需要用isinstance()進(jìn)行判斷,當(dāng)然也可以將單元格的值先用int()轉(zhuǎn)為整型再判斷。

篩選出符合條件的行號就可以提取行并且放入新的Excel中了,因此需要先創(chuàng)建新的工作簿,現(xiàn)在創(chuàng)建新的工作簿寫入符合條件的行,思路是根據(jù)行號獲取到指定行后,遍歷所有單元格的值組裝成一個列表,用sheet.append()寫入新表

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 + '/' + '符合篩選條件的新表.xlsx')

初級難度的需求已經(jīng)成功完成,至此我們已經(jīng)學(xué)會從單個表中提取需要的行并且放到新的表格里。有的人可能會說了:一個表格的篩選可以直接用Excel中的 篩選 來完成,不需要用代碼寫這么復(fù)雜,還難以理解。因此就有了進(jìn)階需求?,F(xiàn)在需要完成的工作變成,獲取1000個表格中所有符合條件的行并匯總成一個新表。如果是手動操作的行,需要打開每個表格,然后一通篩選操作后,將所有滿足條件的行都復(fù)制到新表,并且執(zhí)行上述操作1000次!

這顯然不現(xiàn)實,而如果你已經(jīng)理解初級需求的思路,那么只需要加上幾行代碼,就可以完成進(jìn)階需求。所需要的模塊是glob。批處理的大概代碼框架如下:

import glob

# 1000份數(shù)據(jù)所在的文件夾目錄
path = 'C:/Users/xxxxxx'

for file in glob.glob(path + '/*'):
    pass

如果需要遍歷特定類型的文件可以限定后綴,以xlsx后綴的Excel文件為例

for file in glob.glob(path + '/*.xlsx'):
    pass

最后只需要將上面寫好的針對單個文件的代碼放到循環(huán)體內(nèi)部,且load_workbook的路徑變成循環(huán)出的每一個xlsx文件的絕對路徑。當(dāng)然,還需要想清楚有些代碼不能在循環(huán)體里重復(fù)被執(zhí)行,如創(chuàng)建新表和給新表添加表頭,創(chuàng)建新表放在循環(huán)體外就可以,添加表頭可以用一個單獨的變量來判斷這個操作是否已經(jīng)被執(zhí)行。完整代碼如下:

from openpyxl import load_workbook, Workbook
import glob

path = 'C:/Users/xxxxxx'
new_workbook = Workbook()
new_sheet = new_workbook.active

# 用flag變量明確新表是否已經(jīng)添加了表頭,只要添加過一次就無須重復(fù)再添加
flag = 0

for file in glob.glob(path + '/*.xlsx'):
    workbook = load_workbook(file)
    sheet = workbook.active
    
    buy_mount = sheet['F']
    row_lst = []
    for cell in buy_mount:
        if isinstance(cell.value, int) and cell.value > 50:
            print(cell.row)
            row_lst.append(cell.row)
    
    if not flag:
        header = sheet[1]
        header_lst = []
        for cell in header:
            header_lst.append(cell.value)
        new_sheet.append(header_lst)
        flag = 1
    
    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 + '/' + '符合篩選條件的新表.xlsx')

小結(jié)

以上就是使用Python實現(xiàn)批量從Excel中提取指定數(shù)據(jù)的全部過程和代碼,如果你也有相關(guān)需求,稍作修改即可使用。其實如果你仔細(xì)思考會發(fā)現(xiàn)這個需求使用pandas會以更簡潔的代碼實現(xiàn),但是由于我們之后的Python辦公自動化案例中會頻繁使用openpyxl,并且在操作Excel時有更多的功能,因此在之后我們將主要講解如何使用這個openpyxl實現(xiàn)。最后還是希望大家能夠理解Python辦公自動化的一個核心就是批量操作-解放雙手,讓復(fù)雜的工作自動化!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多