Python处理大量Excel文件的十个技巧分享

2025-05-28 03:50

本文主要是介绍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文件的十个技巧分享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154810

相关文章

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核