当前位置: 代码网 > it编程>前端脚本>Python > 使用Python对Excel数据读取与保存的全面指南

使用Python对Excel数据读取与保存的全面指南

2025年12月17日 Python 我要评论
1. pandas读写excel核心函数解析pandas提供了完善的excel文件支持,可以处理.xlsx、.xls等多种格式的电子表格文件。1.1 数据读取函数:read_excel()pd.rea

1. pandas读写excel核心函数解析

pandas提供了完善的excel文件支持,可以处理.xlsx.xls等多种格式的电子表格文件。

1.1 数据读取函数:read_excel()

pd.read_excel()函数是pandas中用于读取excel数据的核心方法,支持丰富的参数配置:

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文件的指定工作表
    """

关键参数详解

  • io:文件路径,支持字符串、路径对象或文件流
  • sheet_name:工作表指定,可以是名称(str)、索引(int)或列表(多工作表)
  • header:指定作为列名的行号,默认为0(第一行)
  • usecols:选择特定列读取,提高读取效率
  • nrows:限制读取行数,适合探索大型文件
  • dtype:指定列数据类型,优化内存使用

1.2 数据写入函数: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:
    """
    将数据保存到excel文件,支持单个或多个工作表
    """

2. 数据读取与保存的常见场景

2.1 单工作表读取

最基本的应用场景,读取指定excel文件的特定工作表:

# 读取单个工作表
df = pd.read_excel('data.xlsx', sheet_name='sheet1')

2.2 工作表级别精细读取

2.2.1 读取单个工作表的基本信息

在实际数据处理中,我们经常需要先了解工作表的结构再决定如何读取:

def get_excel_info(file_path: str | path) -> dict:
    """
    获取excel文件的基本信息,包括工作表数量、名称、数据范围等
    """
    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  # 获取默认打开时选中的工作表
        }
        
        # 获取每个工作表的详细数据范围
        sheets_info = {}
        for sheet_name in wb.sheetnames:
            ws = wb[sheet_name]
            sheets_info[sheet_name] = {
                'max_row': ws.max_row,        # 工作表的最大数据行数
                'max_column': ws.max_column   # 工作表的最大数据列数
            }
        
        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 读取特定工作表的特定区域

对于大型工作表,可以只读取需要的区域:

# 只读取a到c列,跳过前两行标题,只读取100行数据
df = pd.read_excel('large_file.xlsx', 
                   sheet_name='sheet1',
                   usecols='a:c',
                   skiprows=2,
                   nrows=100)

2.3 批量处理:读取文件夹中的多个excel文件

在实际项目中,经常需要处理整个文件夹中的多个excel文件。思路如下:

2.4 数据导出与格式控制

将处理结果保存为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. 实战演示:完整excel数据处理流程

以下是一个完整的实际应用示例,展示从数据读取、处理到保存的全过程:

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数据读取和保存操作
    """

    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: 跳过的行数
            nrows: 读取的行数限制

        returns:
            pd.dataframe: 读取的数据框
        """
        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]: 工作表名到数据框的映射字典
        """
        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:
        """
        将数据保存到excel文件[1,4](@ref),可以保存一个sheet的数据或者多个sheet的数据

        args:
            data: 要保存的数据,可以是单个dataframe或工作表字典
            output_path: 输出文件路径
            index: 是否保存索引
            **kwargs: 其他pandas参数

        returns:
            bool: 保存是否成功
        """
        try:
            if isinstance(data, pd.dataframe):
                # 保存单个数据框
                data.to_excel(output_path, index=index, **kwargs)
                print(f"成功保存单个数据框到: {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),  # 工作表总数[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,  # 工作表的最大数据行数(从1开始)
                    'max_column': ws.max_column  # 工作表的最大数据列数(从1开始)
                }

            # 将各工作表详细信息添加到返回字典
            info['sheets_info'] = sheets_info
            wb.close()  # 关闭工作簿释放资源

            return info

        except exception as e:
            print(f"获取文件信息失败: {e}")
            return {}  # 发生异常时返回空字典


# 使用示例
if __name__ == "__main__":
    # 创建处理器实例
    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数组
    filtered_array = array[1,:] #通过切片读取特定区域的数据
    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}")

    #保存数据到excel
    target_folder = path(r"f:\target")
    new_name = "new.xlsx"
    excel_io.save_to_excel(df_single, target_folder/new_name)

    #读取目标文件夹所有数据,并保存
    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:
        #数据读取
        df = excel_io.read_single_sheet(excel_path,"sheet1")

        ##数据处理

        #数据保存
        save_excel_name = path(excel_path).name #可以通过修改名称进行重命名
        excel_io.save_to_excel(df, target_folder / save_excel_name) #保存至excel

4. 常见问题与解决方案

4.1 编码问题导致读取失败

问题:读取时出现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:  # 限制处理块数,避免无限循环
        break

# 或者只读取必要列
df = pd.read_excel('large_file.xlsx', usecols=['必要列1', '必要列2'])

4.3 数据类型自动识别错误

问题:数值被识别为文本,日期格式错误等

解决方案

# 明确指定列数据类型
df = pd.read_excel('file.xlsx', 
                   dtype={'电话': str, '数量': 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  # 继续处理下一个文件
    
    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 保存时的格式丢失

问题:保存后数字格式、日期格式等丢失

解决方案

# 使用excelwriter进行精细控制
with pd.excelwriter('output.xlsx', engine='openpyxl') as writer:
    df.to_excel(writer, sheet_name='数据', index=false)
    
    # 获取工作表对象进行格式设置
    worksheet = writer.sheets['数据']
    
    # 设置数字格式
    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数据读取与保存的全面指南的详细内容,更多关于python excel数据读取与保存的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com