使用Python對Excel數(shù)據(jù)讀取與保存的全面指南
1. Pandas讀寫Excel核心函數(shù)解析
Pandas提供了完善的Excel文件支持,可以處理.xlsx、.xls等多種格式的電子表格文件。
1.1 數(shù)據(jù)讀取函數(shù):read_excel()
pd.read_excel()函數(shù)是Pandas中用于讀取Excel數(shù)據(jù)的核心方法,支持豐富的參數(shù)配置:
def read_single_sheet(file_path: str | Path, sheet_name: str | int = 0,
usecols: Optional[List] = None, skiprows: int = 0,
nrows: Optional[int] = None) -> pd.DataFrame:
"""
讀取單個Excel文件的指定工作表
"""
關鍵參數(shù)詳解:
- io:文件路徑,支持字符串、路徑對象或文件流
- sheet_name:工作表指定,可以是名稱(str)、索引(int)或列表(多工作表)
- header:指定作為列名的行號,默認為0(第一行)
- usecols:選擇特定列讀取,提高讀取效率
- nrows:限制讀取行數(shù),適合探索大型文件
- dtype:指定列數(shù)據(jù)類型,優(yōu)化內存使用
1.2 數(shù)據(jù)寫入函數(shù):to_excel()
將DataFrame寫入Excel文件同樣簡單直觀:
def save_to_excel(data: Union[pd.DataFrame, Dict[str, pd.DataFrame]],
output_path: str | Path, index: bool = False, **kwargs) -> bool:
"""
將數(shù)據(jù)保存到Excel文件,支持單個或多個工作表
"""
2. 數(shù)據(jù)讀取與保存的常見場景
2.1 單工作表讀取
最基本的應用場景,讀取指定Excel文件的特定工作表:
# 讀取單個工作表
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
2.2 工作表級別精細讀取
2.2.1 讀取單個工作表的基本信息
在實際數(shù)據(jù)處理中,我們經常需要先了解工作表的結構再決定如何讀?。?/p>
def get_excel_info(file_path: str | Path) -> Dict:
"""
獲取Excel文件的基本信息,包括工作表數(shù)量、名稱、數(shù)據(jù)范圍等
"""
try:
wb = load_workbook(file_path, read_only=True)
info = {
'file_name': os.path.basename(file_path),
'sheet_count': len(wb.sheetnames),
'sheet_names': wb.sheetnames,
'active_sheet': wb.active.title # 獲取默認打開時選中的工作表
}
# 獲取每個工作表的詳細數(shù)據(jù)范圍
sheets_info = {}
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
sheets_info[sheet_name] = {
'max_row': ws.max_row, # 工作表的最大數(shù)據(jù)行數(shù)
'max_column': ws.max_column # 工作表的最大數(shù)據(jù)列數(shù)
}
info['sheets_info'] = sheets_info
wb.close()
return info
except Exception as e:
print(f"獲取文件信息失敗: {e}")
return {}
2.2.2 多工作表處理
當Excel文件包含多個工作表時,可以一次性讀取所有工作表:
# 讀取所有工作表,返回字典{sheet_name: DataFrame}
all_sheets = pd.read_excel('data.xlsx', sheet_name=None)
# 或者讀取特定多個工作表
selected_sheets = pd.read_excel('data.xlsx', sheet_name=['Sheet1', 'Sheet2'])
2.2.3 讀取特定工作表的特定區(qū)域
對于大型工作表,可以只讀取需要的區(qū)域:
# 只讀取A到C列,跳過前兩行標題,只讀取100行數(shù)據(jù)
df = pd.read_excel('large_file.xlsx',
sheet_name='Sheet1',
usecols='A:C',
skiprows=2,
nrows=100)
2.3 批量處理:讀取文件夾中的多個Excel文件
在實際項目中,經常需要處理整個文件夾中的多個Excel文件。思路如下:

2.4 數(shù)據(jù)導出與格式控制
將處理結果保存為Excel文件時,可以精細控制輸出格式:
# 保存單個DataFrame
df.to_excel('output.xlsx', index=False, sheet_name='處理結果')
# 保存多個DataFrame到同一文件的不同工作表
with pd.ExcelWriter('multi_sheet_output.xlsx') as writer:
df1.to_excel(writer, sheet_name='匯總', index=False)
df2.to_excel(writer, sheet_name='詳情', index=False)
3. 實戰(zhàn)演示:完整Excel數(shù)據(jù)處理流程
以下是一個完整的實際應用示例,展示從數(shù)據(jù)讀取、處理到保存的全過程:
import pandas as pd
import glob
from pathlib import Path
from typing import List, Union, Dict, Optional
from openpyxl import load_workbook, Workbook
from file_io import FileIO
class ExcelIO:
"""
Excel文件處理工具類
封裝常見的Excel數(shù)據(jù)讀取和保存操作
"""
def __init__(self):
pass
@staticmethod
def read_single_sheet(file_path: str | Path, sheet_name: str | int = 0,
usecols: Optional[List] = None, skiprows: int = 0,
nrows: Optional[int] = None) -> pd.DataFrame:
"""
讀取單個Excel文件的指定工作表[1,4](@ref)
Args:
file_path: Excel文件路徑
sheet_name: 工作表名稱或索引,默認為第一個工作表
usecols: 指定讀取的列
skiprows: 跳過的行數(shù)
nrows: 讀取的行數(shù)限制
Returns:
pd.DataFrame: 讀取的數(shù)據(jù)框
"""
try:
df = pd.read_excel(
file_path,
sheet_name=sheet_name,
usecols=usecols,
skiprows=skiprows,
nrows=nrows
)
print(f"成功讀取文件: {file_path}, 工作表: {sheet_name}")
return df
except Exception as e:
print(f"讀取文件失敗: {e}")
return pd.DataFrame()
@staticmethod
def read_all_sheets(file_path: str | Path) -> Dict[str, pd.DataFrame]:
"""
讀取單個Excel文件的所有工作表[1](@ref)
Args:
file_path: Excel文件路徑
Returns:
Dict[str, pd.DataFrame]: 工作表名到數(shù)據(jù)框的映射字典
"""
try:
all_sheets = pd.read_excel(file_path, sheet_name=None)
print(f"成功讀取文件的所有工作表: {file_path}, 共{len(all_sheets)}個工作表")
return all_sheets
except Exception as e:
print(f"讀取所有工作表失敗: {e}")
return {}
@staticmethod
def save_to_excel(data: Union[pd.DataFrame, Dict[str, pd.DataFrame]],
output_path: str | Path, index: bool = False, **kwargs) -> bool:
"""
將數(shù)據(jù)保存到Excel文件[1,4](@ref),可以保存一個sheet的數(shù)據(jù)或者多個sheet的數(shù)據(jù)
Args:
data: 要保存的數(shù)據(jù),可以是單個DataFrame或工作表字典
output_path: 輸出文件路徑
index: 是否保存索引
**kwargs: 其他pandas參數(shù)
Returns:
bool: 保存是否成功
"""
try:
if isinstance(data, pd.DataFrame):
# 保存單個數(shù)據(jù)框
data.to_excel(output_path, index=index, **kwargs)
print(f"成功保存單個數(shù)據(jù)框到: {output_path}")
elif isinstance(data, dict):
# 保存多個工作表
with pd.ExcelWriter(output_path) as writer:
for sheet_name, df in data.items():
# 確保工作表名稱有效
valid_sheet_name = str(sheet_name)[:31] # Excel工作表名最大31字符
df.to_excel(writer, sheet_name=valid_sheet_name, index=index, **kwargs)
print(f"成功保存{len(data)}個工作表到: {output_path}")
return True
except Exception as e:
print(f"保存文件失敗: {e}")
return False
@staticmethod
def get_excel_info(file_path: str | Path) -> Dict:
"""
獲取Excel文件的基本信息
Args:
file_path: Excel文件路徑,可以是字符串或Path對象
Returns:
Dict: 包含Excel文件信息的字典
"""
try:
# 確保文件路徑為Path對象(兼容str格式)
file_path = Path(file_path)
# 以只讀模式加載Excel工作簿(提高大文件讀取效率)
wb = load_workbook(file_path, read_only=True)
# 構建信息字典,包含文件基本屬性[7](@ref)
info = {
'file_name': file_path.name, # 提取文件名(不含路徑)
'sheet_count': len(wb.sheetnames), # 工作表總數(shù)[7](@ref)
'sheet_names': wb.sheetnames, # 所有工作表名稱列表[7](@ref)
'active_sheet': wb.active.title # 默認激活的工作表名稱[6](@ref)
}
# 遍歷每個工作表,獲取詳細信息[7](@ref)
sheets_info = {}
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
sheets_info[sheet_name] = {
'max_row': ws.max_row, # 工作表的最大數(shù)據(jù)行數(shù)(從1開始)
'max_column': ws.max_column # 工作表的最大數(shù)據(jù)列數(shù)(從1開始)
}
# 將各工作表詳細信息添加到返回字典
info['sheets_info'] = sheets_info
wb.close() # 關閉工作簿釋放資源
return info
except Exception as e:
print(f"獲取文件信息失敗: {e}")
return {} # 發(fā)生異常時返回空字典
# 使用示例
if __name__ == "__main__":
# 創(chuàng)建處理器實例
excel_io = ExcelIO()
source_folder = Path(r"F:\test")
excel_name = "data.xlsx"
# 讀取單個文件,單個工作表
df_single = excel_io .read_single_sheet(source_folder / excel_name , "Sheet1")
print(df_single)
array = df_single.to_numpy()# 轉換為NumPy數(shù)組
filtered_array = array[1,:] #通過切片讀取特定區(qū)域的數(shù)據(jù)
print( filtered_array)
# 讀取單個文件,所有工作表
all_sheets = excel_io .read_all_sheets(source_folder / excel_name )
print(all_sheets)
print(all_sheets["Sheet1"])
# 獲取文件信息
file_info = excel_io.get_excel_info(source_folder / excel_name)
print(f"文件信息: {file_info}")
#保存數(shù)據(jù)到Excel
target_folder = Path(r"F:\target")
new_name = "new.xlsx"
excel_io.save_to_excel(df_single, target_folder/new_name)
#讀取目標文件夾所有數(shù)據(jù),并保存
file_io = FileIO(source_folder, target_folder )
file_paths = file_io.list_file_paths(True) #遍歷所有文件,包括子文件夾里的
excel_paths = file_io.filter_by_strings(file_paths ,[".xlsx"],True)#獲取Excel文件
for excel_path in excel_paths:
#數(shù)據(jù)讀取
df = excel_io.read_single_sheet(excel_path,"Sheet1")
##數(shù)據(jù)處理
#數(shù)據(jù)保存
save_excel_name = Path(excel_path).name #可以通過修改名稱進行重命名
excel_io.save_to_excel(df, target_folder / save_excel_name) #保存至excel
4. 常見問題與解決方案
4.1 編碼問題導致讀取失敗
問題:讀取時出現(xiàn)UnicodeDecodeError等編碼錯誤
解決方案:
# 指定編碼格式讀取
df = pd.read_excel('file.xlsx', encoding='utf-8') # 或gbk、gb2312等
# 如仍失敗,可先以二進制方式讀取再處理
with open('problem_file.xlsx', 'rb') as f:
df = pd.read_excel(f)
4.2 大型文件內存不足
問題:讀取大文件時內存占用過高
解決方案:
# 分塊讀取
chunk_size = 10000
chunks = pd.read_excel('large_file.xlsx', chunksize=chunk_size)
for i, chunk in enumerate(chunks):
process_chunk(chunk) # 逐塊處理
if i >= 10: # 限制處理塊數(shù),避免無限循環(huán)
break
# 或者只讀取必要列
df = pd.read_excel('large_file.xlsx', usecols=['必要列1', '必要列2'])
4.3 數(shù)據(jù)類型自動識別錯誤
問題:數(shù)值被識別為文本,日期格式錯誤等
解決方案:
# 明確指定列數(shù)據(jù)類型
df = pd.read_excel('file.xlsx',
dtype={'電話': str, '數(shù)量': int}, # 明確指定類型
parse_dates=['日期列']) # 明確解析日期列
4.4 批量處理中的錯誤處理
問題:批量處理多個文件時,單個文件錯誤導致整個任務失敗
解決方案:
def safe_batch_process(folder_path):
"""帶錯誤處理的批量處理"""
excel_files = glob.glob(os.path.join(folder_path, "*.xlsx"))
success_count = 0
error_files = []
for file_path in excel_files:
try:
# 嘗試讀取和處理文件
df = pd.read_excel(file_path)
# ...處理邏輯...
success_count += 1
print(f"成功處理: {os.path.basename(file_path)}")
except Exception as e:
error_files.append((os.path.basename(file_path), str(e)))
print(f"處理失敗: {os.path.basename(file_path)}, 錯誤: {e}")
continue # 繼續(xù)處理下一個文件
print(f"處理完成: 成功 {success_count} 個, 失敗 {len(error_files)} 個")
if error_files:
print("失敗文件列表:")
for file_name, error in error_files:
print(f" {file_name}: {error}")
return success_count, error_files
4.5 保存時的格式丟失
問題:保存后數(shù)字格式、日期格式等丟失
解決方案:
# 使用ExcelWriter進行精細控制
with pd.ExcelWriter('output.xlsx', engine='openpyxl') as writer:
df.to_excel(writer, sheet_name='數(shù)據(jù)', index=False)
# 獲取工作表對象進行格式設置
worksheet = writer.sheets['數(shù)據(jù)']
# 設置數(shù)字格式
for column in worksheet.columns:
column_name = column[0].value
if column_name in ['金額', '價格']:
for cell in column[1:]: # 跳過標題行
cell.number_format = '#,##0.00'
以上就是使用Python對Excel數(shù)據(jù)讀取與保存的全面指南的詳細內容,更多關于Python Excel數(shù)據(jù)讀取與保存的資料請關注腳本之家其它相關文章!
相關文章
淺談python中的@以及@在tensorflow中的作用說明
這篇文章主要介紹了淺談python中的@以及@在tensorflow中的作用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Python錯誤NameError:name?'X'?is?not?defined的解決方法
這篇文章主要給大家介紹了關于Python錯誤NameError:name?‘X‘?is?not?defined的解決方法,這是最近工作中遇到的一個問題,文中通過實例代碼將解決的方法介紹的非常詳細,需要的朋友可以參考下2023-03-03
Pyenv uninstall刪除不需要的Python版本的詳細操作
文章介紹了如何使用pyenv和Miniconda來管理Python環(huán)境,特別是在清理不再需要的Python版本和環(huán)境時的實戰(zhàn)技巧,強調了pyenv作為Python版本管理器的優(yōu)勢,感興趣的朋友跟隨小編一起看看吧2026-03-03
Python之random.sample()和numpy.random.choice()的優(yōu)缺點說明
這篇文章主要介紹了Python之random.sample()和numpy.random.choice()的優(yōu)缺點說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06

