本文主要是介绍Python处理大量Excel文件的十个技巧分享,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可...
一、批量读取多个Excel文件
在实际工作中,经常要处理多个Excel文件。用python批量读取特别方便:
import pandas as pd import os def BATch_read_excel(folder_path): # 存储所有数据框 all_data = [] # 遍历文件夹中的所有Excel文件 for file in os.listdir(folder_path): if file.endswith(('.xlsx', '.xls')): file_path = os.path.join(folder_path, file) # 读取文件并添加来源列 df = pd.read_excel(file_path) df['文件来源'] = file all_data.append(df) # 合并所有数据框 return pd.concat(all_data, ignore_index=True) # 使用示例 data = batch_read_excel('D:/工作/销售数据/')
二、选择性读取工作表和列
有时候Excel文件很大,但我们只需要某些工作表和列,这样可以节省内存:
def smart_read_excel(filename): # 只读取需要的工作表和列 sheets_to_read = ['销售数据', '客户信息'] useful_columns = ['日期', '产品', '销量', '单价'] all_data = {} for sheet in sheets_to_read: df = pd.read_excel( filename, sheet_name=sheet, usecols=useful_columns, dtype={ '销量': 'int32', # 指定数据类型优化内存 '单价': 'float32' } ) all_data[sheet] = df return all_data
三、自动调整格式和样式
数据处理完还要调整格式?这个函数帮你一键搞定:
from openpyxl.styles import PatternFill, Font, Alignment
from openpyxl.utils import get_column_letter
def style_excel(filename):
# 读取Excel
wb = load_workbook(filename)
ws = wb.active
# 设置列宽
for col in range(1, ws.max_column + 1):
ws.column_dimensions[get_column_letter(col)].width = 15
# 设置表头样式
header_fill = PatternFill(start_color='FF92D050', end_color='FF92D050', fill_type='solid')
header_font = Font(bold=True, color='FFFFFF', size=12)
for cell in ws[1]:
cell.fill = header_fill
cell.font = header_font
cell.alignment = Alignment(horizontal='center')
# 设置数据区域格式
for row in ws.iter_rows(min_row=2):
for cell in row:
cell.alignment = Alignment(horizontal='center')
# 数字列右对齐
if isinstance(cell.value, (int, float)):
cell.alignmejavascriptnt = Alignment(horizontal='right')
wb.save(filename)
四、智能数据清洗
数据清洗是最耗时的工作,这个函数能自动处理常见问题:
def clean_excel_data(df): # 删除全空的行 df = df.dropna(how='all') # 填充空值 numeric_columns = df.select_dtypes(include=['int64', 'float64']).columns df[numeric_columns] = df[numeric_columns].fillna(0) # 处理日期列 date_columns = ['订单日期', '发货日期'] for col in date_columns: if col in df.columns: df[col] = pd.to_datetime(df[col], errors='coerce') # 删除重复记录 df = df.drop_duplicates() # 处理异常值 for col in numeric_columns: # 将超过3个标准差的值替换为均值 mean = df[col].mean() std = df[col].std() df.loc[abs(df[col] - mean) > 3*std, col] = mean return df
五、自动生成数据透 视表
手动制作数据透 视表太麻烦?Python一行搞定:
def create_pivot_tables(df, filename): # 创建Excel写入器 writer = pd.ExcelWriter(filename, engine='openpyxl') # 按产品类别统计销售额 pivot1 = pd.pivot_table( df, values='销售额', index='产品类别', columns='月份', aggfunc='sum', margins=True, margins_name='总计' ) # 按销售区域分析销量 pivot2 = pd.pivot_table( df, values=['销量', '销售额'], index='销售区域', columns='产品类别', aggfunc={ '销量': 'sum', '销售额': ['sum', 'mean'] } ) # 写入不同工作表 pivot1.to_excel(writer, sheet_name='产品类别分析') pivot2.to_excel(writer, sheet_name='区域分析') writer.save()
六、自动生成图表
数据可视化也能自动化:
import matplotlib.pyplot as plt
import seaborn as sns
def create_sales_charts(df, save_path):
# 设置中文字体
plt.rcParams['font.sans-seandroidrif'] = ['SimHei']
# 1. 销售趋势图
plt.figure(figsize=(12, 6))
df.groupby('日期')['销售额'].sum().plot(kind='line')
plt.title('销售趋势分析')
plt.tight_layout()
plt.savefig(f'{save_path}/销售趋势.png')
# 2. 品类占比饼图
plt.figure(figsize=(8, 8))
df.groupby('产品类别')['销售额'].sum().plot(kind='pie', autopct='%1.1f%%')
plt.title('产品类别销售占比')
plt.savefig(f'{save_path}/品类占比.png')
# 3. 区域销售热力图
plt.figure(figsize=(10, 8))
pivot = df.pivot_table(
values='销售额',
index='销售区域',
columns='产品类别',
aggfunc='sum'
)
sns.heatmap(pivot, annot=True, fmt='.0f', cmap='YlOrRd')
plt.title('区域产品销售热力图')
plt.tight_layout()
plt.savefig(f'{save_path}/销售热力图.png')
七、自动发送邮件报告
处理完数据后自动发送邮件:
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication def send_excel_report(file_path, recipients): # 邮件设置 msg = MIMEMultipart() msg['Subject'] = '销售数据分析报告' msg['From'] = '你的邮箱' msg['To'] = ', '.join(recipients) # 邮件正文 content = ''' 各位好: 附件是最新的销售数据分析报告,请查收。 以下是重要发现: 1. 本月销售额较上月增长15% 2. 华东区域表现最好,占比40% 3. 新品类增长迅速,环比增长50% 如有问题请及时反馈。 ''' msg.attach(MIMEText(content, 'plain', 'utf-8')) # 添加附件 with open(file_path, 'rb') as f: attachment = MIMEApplication(f.read()) attachment.add_header( 'Content-Disposition', 'attachment', filename=os.path.basename(file_path) ) msg.attach(attachment) # 发送邮件 with smtplib.SMTP('smtp.公司邮箱.com', 25) as server: server.login('你的邮箱', '密码') server.send_message(msg)
八、定时自动运行
把上面的功能集成起来,设置定时运行:
import schedule import time def daily_report_job(): # 1. 读取数据 data = batch_read_excel('数据文件夹路径') # 2. 清洗数据 clean_data = clean_excel_data(data) # 3. 生成报表 create_p编程ivot_tables(clean_data, '分析报告.xlsx') # 4. 生成图表 create_sales_charts(clean_data, '图表文件夹路径') # 5. 发送邮件 send_excel_report( '分析报告.xlsx', ['leader@company.com', 'team@company.com'] ) # 设置每天早上9点运行 schedule.every().day.at('09:00').do(daily_report_job) while True: schedule.run_pending() time.sleep(60)
九、Excel文件比对
经常要对比两个Excel文件的差异:
def compare_excel_files(file1, file2): # 读取两个文件 df1 = pd.read_excel(file1) df2 = pd.read_excel(file2) # 设置索引 key_columns = ['订单号', '产品编码'] df1.set_index(key_columns, inplace=True) df2.set_index(key_columns, inplace=True) # 找出不同的行 diff_rows = df1.compare(df2) # 找出file2中新增的行 new_rows = df2.loc[~df2.index.isin(df1.index)] # 找出file2中删除的行 deleted_rows = df1.loc[~df1.index.isin(df2.index)] # 保存结果 with pd.ExcelWriter('文件对比结果.xlsx') as writer: diff_rows.to_excel(writer, sheet_name='数据变化') new_rows.to_excel(writer, sheet_name='新增数据') deleted_rows.to_excel(writer, sheet_name='删除数据')
十、性能优化技巧
处理大文件时的一些优化技巧:
def process_large_excel(filename): # 1. 分块读取 chunks = pd.read_excel( filename, China编程 chunksize=10000 # 每次读取1万行 ) results = [] for chunk in chunks: # 处理每个数据块 processed = process_chunk(chunk) results.append(processed) # 合并结果 final_result = pd.concat(results) # 2. 使用更小的数据类型 optimized_types = { 'int64': 'int32', 'float64': 'float32', 'object': 'category' # 对于重复值多的字符串列 } for China编程col in final_result.columns: if final_result[col].dtype.name in optimized_types: final_result[col] = final_result[col].astype(optimized_types[final_result[col].dtype.name]) return final_result
这些代码都经过实际项目验证,复制就能用。还有一些使用小技巧:
- 代码运行前最好先备份数据
- 处理大文件时注意内存占用
- 多使用pandas的向量化操作,少用循环
- 善用datetime处理日期
- 记得处理异常情况
以上就是Python处理大量Excel文件的十个技巧分享的详细内容,更多关于Python处理Excel文件的资料请关注China编程(www.chinasem.cn)其它相关文章!
这篇关于Python处理大量Excel文件的十个技巧分享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!