您好,登錄后才能下訂單哦!
這篇文章主要介紹了Pandas怎么封裝Excel工具類的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Pandas怎么封裝Excel工具類文章都會有所收獲,下面我們一起來看看吧。
Excel是一種廣泛使用的電子表格軟件,它提供了大量的數(shù)據(jù)處理和計(jì)算功能,被廣泛應(yīng)用于數(shù)據(jù)分析和報(bào)告中。在Python中,我們可以使用pandas庫來讀寫和處理Excel文件。但是,為了更方便和快速地操作Excel文件,我們可以封裝一個(gè)Excel工具類,提供常用的讀寫操作方法,以提高開發(fā)效率。
這個(gè)方法可以將數(shù)據(jù)集列表轉(zhuǎn)換為Excel文件。該方法使用pd.ExcelWriter()
創(chuàng)建Excel文件寫入器,然后使用pd.DataFrame()
創(chuàng)建一個(gè)數(shù)據(jù)幀對象,再將其寫入Excel文件中。
#!/usr/bin/python3 # -*- coding: utf-8 -*- # @Author: Hui # @Desc: { Excel文件操作工具模塊 } # @Date: 2022/04/03 19:34 import pandas as pd from typing import List, Union, Dict, IO class ExcelUtils(object): """ Excel文件操作工具類 """ @classmethod def list_to_excel( cls, path_or_buffer: Union[str, IO], data_list: list, col_mapping: dict = None, sheet_name: str = 'Sheet1', **kwargs ): """ 列表轉(zhuǎn) excel文件 Args: path_or_buffer: 文件路徑或者緩沖流 data_list: 數(shù)據(jù)集 List[dict] col_mapping: 表頭列字段映射 sheet_name: sheet名稱 Returns: """ with pd.ExcelWriter(path_or_buffer) as writer: _col_mapping = list(col_mapping) if col_mapping else None df = pd.DataFrame(data=data_list, columns=_col_mapping) if col_mapping: df.rename(columns=col_mapping, inplace=True) df.to_excel(writer, sheet_name=sheet_name, index=False, **kwargs)
這里path_or_buffer
可以是一個(gè)文件路徑或者一個(gè)緩沖流對象,data_list
是一個(gè)列表,包含需要寫入Excel的數(shù)據(jù)。col_mapping
是一個(gè)字典,用于將表頭列字段映射到數(shù)據(jù)集的字段名。
# 示例 user_list = [ dict(id=1, name='hui', age=20), dict(id=2, name='wang', age=22), dict(id=3, name='zack', age=25), ] user_col_mapping = { 'id': '用戶id', 'name': '用戶名', 'age': '年齡', } ExcelUtils.list_to_excel('user.xlsx', user_list, col_mapping=user_col_mapping) # 導(dǎo)出為excel文件字節(jié)流處理 excel_bio = BytesIO() ExcelUtils.list_to_excel( excel_bio, data_list=user_list, col_mapping=user_col_mapping, sheet_name='demo' ) excel_bytes = excel_bio.getvalue() print("excel_bytes type => ", type(excel_bytes)) >>>out excel_bytes type => <class 'bytes'>
這個(gè)例子將一個(gè)用戶數(shù)據(jù)集寫入一個(gè)Excel文件中,并將列名映射為中文,也可以將excel保存在緩存流中(字節(jié)數(shù)據(jù)),在一些web場景中可以更方便的將緩沖流響應(yīng)給前端、或者上傳到一些OSS中,這樣就不用創(chuàng)建臨時(shí)文件、讀取、上傳。
如果有多個(gè)數(shù)據(jù)集需要寫入到同一個(gè)Excel文件中,可以使用該方法。它與前面的方法類似,但接受一個(gè)列表,列表中包含多個(gè)數(shù)據(jù)集及其對應(yīng)的表頭列字段映射和sheet名稱。
將多個(gè)數(shù)據(jù)列表寫入到一個(gè)Excel文件中。
@classmethod def multi_list_to_excel( cls, path_or_buffer: Union[str, IO], data_collects: List[tuple], **kwargs ): """ 多列表轉(zhuǎn)帶不同 sheet的excel文件 Args: path_or_buffer: 文件路徑或者緩沖流 data_collects: 大數(shù)據(jù)集 list[(data_collect, col_mapping, sheet_name)] data_collect: 數(shù)據(jù)集, col_mapping: 列字段映射, sheet_name: excel表sheet名稱 Returns: """ with pd.ExcelWriter(path_or_buffer) as writer: for data_collect, col_mapping, sheet_name in data_collects: df = pd.DataFrame(data=data_collect, columns=list(col_mapping)) df.rename(columns=col_mapping, inplace=True) df.to_excel(writer, sheet_name=sheet_name, index=False, **kwargs)
參數(shù)說明:
path_or_buffer
: 文件路徑或者緩沖流;
data_collects
: 多個(gè)數(shù)據(jù)列表的元組集合,每個(gè)元組包含三個(gè)元素:需要寫入到Excel文件中的數(shù)據(jù)列表,列名與字典key的映射,Excel文件的sheet名稱。
示例:
user_list = [ {'id': 1, 'name': 'hui', 'age': 18}, {'id': 2, 'name': 'wang', 'age': 19}, {'id': 3, 'name': 'zack', 'age': 20} ] book_list = [ {'id': 1, 'name': 'Python基礎(chǔ)教程', 'author': 'hui', 'price': 30}, {'id': 2, 'name': 'Java高級編程', 'author': 'wang', 'price': 50}, {'id': 3, 'name': '機(jī)器學(xué)習(xí)實(shí)戰(zhàn)', 'author': 'zack', 'price': 70}, ] user_col_mapping = {'id': '編號', 'name': '姓名', 'age': '年齡'} book_col_mapping = {'id': '編號', 'name': '書名', 'author': '作者', 'price': '價(jià)格'} data_collects = [ (user_list, user_col_mapping, '用戶信息'), (book_list, book_col_mapping, '圖書信息') ] ExcelUtils.multi_list_to_excel('multi_sheet_data.xlsx', data_collects)
感覺這方法參數(shù)太多,不太容易知道如何入?yún)?,后續(xù)可以用dataclass抽出結(jié)構(gòu)來入?yún)⑦@樣更好理解點(diǎn)。
@classmethod def read_excel( cls, path_or_buffer: Union[str, IO], sheet_name: str = "Sheet1", col_mapping: dict = None, all_col: bool = True, header: int = 0, **kwargs ) -> List[dict]: """ 讀取excel表格數(shù)據(jù),根據(jù)col_mapping替換列名 Args: path_or_buffer: 文件路徑或者緩沖流 sheet_name: 讀書excel表的sheet名稱 col_mapping: 列字段映射 all_col: True返回所有列信息,F(xiàn)alse則返回col_mapping對應(yīng)的字段信息 header: 默認(rèn)0從第一行開啟讀取,用于指定從第幾行開始讀取 Returns: """ use_cols = None if not all_col: # 獲取excel表指定列數(shù)據(jù) use_cols = list(col_mapping) if col_mapping else None df = pd.read_excel(path_or_buffer, sheet_name=sheet_name, usecols=use_cols, header=header, **kwargs) if col_mapping: df.rename(columns=col_mapping, inplace=True) return df.to_dict("records")
示例代碼:
data = [ {"id": 1, "name": "hui", "age": 30}, {"id": 2, "name": "zack", "age": 25}, {"id": 3, "name": "wang", "age": 40}, ] # 將數(shù)據(jù)寫入Excel文件 ExcelUtils.list_to_excel("read_demo.xlsx", data, col_mapping={"id": "用戶ID", "name": "姓名", "age": "年齡"}) # 讀取Excel文件 result = ExcelUtils.read_excel("read_demo.xlsx", col_mapping={"用戶ID": "id", "姓名": "name"}) print(result) >>>out [{'id': 1, 'name': 'hui'}, {'id': 2, 'name': 'zack'}, {'id': 3, 'name': 'wang'}]
可以將字典列表數(shù)據(jù)根據(jù)列字段映射轉(zhuǎn)換成中文表頭的excel,讀取excel時(shí)也可以將中文表頭轉(zhuǎn)成對應(yīng)業(yè)務(wù)字段。
有些模板excel文件默認(rèn)前幾行是說明文字,因此可以指定header參數(shù)來跳過這些說明文字,這里只是把一些常用的參數(shù)封裝了下,**kwargs 還是可以使用pandas的一些參數(shù)。
@classmethod def merge_excel_files( cls, input_files: List[str], output_file: str, sheet_name_mapping: Dict[str, str] = None, **kwargs ): """ 合并多個(gè)Excel文件到一個(gè)文件中(每個(gè)文件對應(yīng)一個(gè)工作表) 如果Excel文件有多個(gè)作表,則默認(rèn)取第一個(gè)工作表 Args: input_files: 待合并的excel文件列表 output_file: 輸出文件路徑 sheet_name_mapping: 文件工作表映射,默認(rèn)為文件名 {"文件名1": "sheet1", "文件名2": "sheet2"} Returns: """ sheet_name_mapping = sheet_name_mapping or {} with pd.ExcelWriter(output_file, **kwargs) as writer: for file in input_files: df = pd.read_excel(file) sheet_name = sheet_name_mapping.get(file, file) df.to_excel(writer, sheet_name=sheet_name, index=False)
示例:
def merge_excel_files_demo(): # 合并多個(gè)Excel文件 ExcelUtils.merge_excel_files( input_files=["user.xlsx", "multi_sheet_data.xlsx"], output_file="merged_data.xlsx", sheet_name_mapping={ "user.xlsx": "user", "multi_sheet_data.xlsx": "multi_sheet_data" } )
關(guān)于“Pandas怎么封裝Excel工具類”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Pandas怎么封裝Excel工具類”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。