Python脚本处理数据写入Excel时,如何确保程序报错中断前已处理的数据仍能保存?

1.python 脚本处理一些数据,从外部写数据到 excel,外部因素非常多

2.很大可能中途直接失败了,失败时程序报错停止时了,也调用不到 save 方法()

3.如何调用保存方法,把报错之前的数据仍写到 excel 中?

4.用的第三方库是 xlwt,为什么没有写一行,保存一次,因为我发现这货,保存后,再写,之前写的就清空掉了,蛋疼
Python脚本处理数据写入Excel时,如何确保程序报错中断前已处理的数据仍能保存?

12 回复

try/finally(save)?


核心方案:使用 try...except...finally 结构,并在 finally 块中执行保存操作。

这样即使程序中途报错,finally 块里的代码也一定会执行,确保已处理的数据能被保存。下面是一个结合 pandasopenpyxl 的完整示例:

import pandas as pd
import traceback

def process_and_save_data(input_data, output_file='output.xlsx'):
    """
    处理数据并实时保存到Excel,即使报错也能保留已处理的部分。
    """
    # 初始化一个空的DataFrame来累积数据
    processed_data = pd.DataFrame()
    
    try:
        # 模拟逐条或分批处理数据
        for i, item in enumerate(input_data):
            # 这里是你的数据处理逻辑,例如:
            processed_row = {
                'id': i,
                'value': item * 2,  # 示例处理
                'status': 'processed'
            }
            # 将新处理的行追加到DataFrame
            processed_data = pd.concat(
                [processed_data, pd.DataFrame([processed_row])],
                ignore_index=True
            )
            
            # 可选:每处理N条就保存一次,减少内存占用和丢失风险
            if (i + 1) % 10 == 0:
                processed_data.to_excel(output_file, index=False)
                print(f"已保存前 {i+1} 条数据到 {output_file}")
                
        # 全部处理完成后,最终保存
        processed_data.to_excel(output_file, index=False)
        print("所有数据处理并保存完成。")
        
    except Exception as e:
        # 捕获异常,打印错误信息
        print(f"处理过程中发生错误: {e}")
        traceback.print_exc()
        
    finally:
        # 无论是否报错,都尝试保存已处理的数据
        if not processed_data.empty:
            processed_data.to_excel(output_file, index=False)
            print(f"程序中断,已保存 {len(processed_data)} 条已处理数据到 {output_file}")

# 示例调用
if __name__ == '__main__':
    # 模拟输入数据(这里用0-99的列表)
    data_to_process = list(range(100))
    # 在第55条数据时模拟一个错误(取消注释测试)
    # if len(data_to_process) > 55: raise ValueError("模拟错误")
    process_and_save_data(data_to_process, 'result.xlsx')

关键点:

  1. finally:这是保证保存操作一定会执行的核心。
  2. 增量保存:在循环内定期保存(如每10条),这样即使后面出错,之前处理的大部分数据也已经存盘。
  3. 异常捕获:用 except 捕获具体异常,方便调试,但保存操作放在 finally 里更可靠。
  4. 检查数据是否为空:保存前检查 processed_data 是否非空,避免覆盖原有文件。

一句话建议:用 try-finally 结构,在 finally 里保存数据。

try …finally

异常目测有 10 几路,try 不完啊,

except 是用来捕获各种异常的,无论异常是什么,finally 在程序结束前都会执行的

4.用的第三方库是 xlwt,为什么没有写一行,保存一次,因为我发现这货,保存后,再写,之前写的就清空掉了

试试 openpyxl,至少没有这个问题,而且我记得 xlwt 对 xlsx 支持得不是很好?

+1 对于 xlsx 有可能遇到问题

不怕麻烦的话,就写一次,存一次,读一次,再写再存咯。但这也太蛋疼了。

我遇见过个类似的跟楼上思路类似,先保存到文件,就用空格或者逗号分隔,搞定之后再写到 excel

这东西没有追加模式只有写模式?

我一般是使用 pandas 直接写 Excel
另外, 两次写文件之间, 至少保持 2-3 秒的间隔。

你就不能先写到 csv 文件中吗???

假设你的程序运行十分钟, 一分钟创建一个 csv 文件, 把一分钟内的数据都写入到这个文件, 这样报错也只会丢失一分钟内的数据(当然时间间隔可以更小),


------ 从这里开始不会收到外部的影响---------
最后把所有的 csv 文件都合并成一个最终版本.

最后的最后如果有需要那就把 csv 转成 excel

回到顶部