You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多次运行Python代码出现Dead Kernel问题,求排查与解决

解决Spyder/Jupyter中Python代码频繁Dead Kernel问题

问题背景

运行Python代码时,Spyder和Jupyter环境频繁触发Dead Kernel错误,代码预期完成:

  • 读取目标文件夹路径
  • 筛选并批量处理CSV文件:导入为DataFrame,清理object类型列文本、重命名指定列、替换特定值,最终导出为Excel文件

代码问题排查

原代码存在多个可能导致Kernel崩溃的隐患:

  1. 低效且不安全的字符串处理:使用列表推导式逐行处理object列,未处理NaN值,大数据量下内存占用过高易引发崩溃;冗余的" "*0*s.count("\\")无意义,徒增计算开销。
  2. 硬编码列重命名风险:直接通过df.columns.values[0]到[4]重命名列,若CSV文件列数不足5列会触发索引越界错误,未被捕获的异常直接终止Kernel。
  3. Excel导出引擎缺失:df.to_excel()未指定引擎,不同环境下默认引擎兼容性差,易引发导出失败甚至Kernel崩溃。
  4. 异常捕获范围过窄:仅捕获列处理部分的异常,pd.read_csv()、df.to_excel()等环节的异常未被处理,出错直接导致Kernel挂掉。
  5. 逐行apply效率低下:自定义函数用apply逐行处理,比pandas矢量化操作慢数十倍,大数据量下极易耗尽资源。

修复后的代码

import os
import pandas as pd

pcid = os.getlogin()

print('--')
print(f'-- hello {pcid}')
print("--")

data_in = input("the path for folder?: ")
print("--")

folder_path = data_in.replace('"', '')

# 提前筛选CSV文件,减少无效判断
files = [f for f in os.listdir(folder_path) 
         if os.path.isfile(os.path.join(folder_path, f)) 
         and f.lower().endswith('.csv')]

for file_name in files:
    file_path = os.path.join(folder_path, file_name)
    print("Processing file:", file_name)
    
    try:
        # 读取CSV,关闭自动类型推断警告
        df = pd.read_csv(file_path, delimiter=";", decimal=",", low_memory=False)
        
        # 矢量化处理object列,自动兼容NaN值
        for col in df.select_dtypes(include=['object']).columns:
            # 截取最后一个反斜杠后的内容
            df[col] = df[col].str.split("\\").str[-1]
            # 移除前导空格,效率远高于逐行apply
            df[col] = df[col].str.lstrip()
        
        # 检查列数足够再重命名,避免索引越界
        if len(df.columns) >= 5:
            df.columns.values[:5] = ["Product", "Market", "Period", "Measure", "Data"]
        else:
            print(f"Warning: {file_name}列数不足5列,跳过列重命名")
        
        # 替换指定值,先检查列是否存在
        if 'Measure' in df.columns:
            df['Measure'] = df['Measure'].str.replace('Loyalty Value Seg', 'Loyalty Value', regex=False)
        
        # 指定openpyxl引擎导出Excel,兼容多环境
        excel_path = file_path.replace(".csv", ".xlsx")
        df.to_excel(excel_path, index=False, engine='openpyxl')
        
    except Exception as e:
        print(f"Error processing file: {file_name}, Error: {str(e)}")
        continue

print('--')
print("Done")
print('\a')

关键修复说明

  • 矢量化字符串操作:用str.split()、str.lstrip()替代列表推导式和apply,处理速度提升数倍,自动兼容NaN值,避免内存溢出。
  • 安全列重命名:先检查列数再修改,防止索引越界错误。
  • 指定Excel引擎:添加engine='openpyxl',确保导出稳定(需提前安装:pip install openpyxl)。
  • 全局异常捕获:将所有文件处理逻辑放入try-except,出错时输出信息并继续处理下一个文件,不会导致Kernel崩溃。
  • 优化文件遍历:提前筛选CSV文件,减少无效判断,避免处理子文件夹。

内容的提问来源于stack exchange,提问作者Sten B. Rasmussen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:55:09