Pandas DataFrame.to_csv报FileNotFoundError,生产环境异常求助
问题排查与解决方案
可能的报错原因及对应修复
工作表名称含非法字符:生产环境中出错的工作表名可能包含系统不允许的文件夹命名字符(如
/ \ : * ? " < > |),导致创建文件夹失败。
修复:创建文件夹前清洗工作表名称,替换非法字符:import re # 将所有非法文件夹字符替换为下划线 clean_sheet_name = re.sub(r'[\\/*?:"<>|]', '_', sheet_name) sheet_folder_path = os.path.join(processed_directory, clean_sheet_name)文件路径过长:生产环境的
processed_directory路径加上工作表名、文件名后,超出系统允许的最大路径长度(Windows默认260字符)。
修复:- 缩短
processed_directory的基础路径 - 简化CSV文件名,比如仅保留工作表名:
csv_file_name = f"{clean_sheet_name}.csv" - 创建文件夹时使用
exist_ok=True简化逻辑,避免重复判断
- 缩短
权限不足:生产环境下程序没有目标文件夹的读写权限,或对应文件夹被占用/设为只读。
修复:- 检查
processed_directory的权限,确保运行程序的用户拥有读写权限 - 创建文件夹时指定权限参数:
os.makedirs(sheet_folder_path, exist_ok=True, mode=0o775)
- 检查
数据编码问题:出错的工作表数据包含特殊编码字符,导致
to_csv写入失败。
修复:指定兼容的编码格式,比如utf-8-sig(适配Windows):df.to_csv(csv_file_path, index=False, sep='~', encoding='utf-8-sig')
优化后的完整代码
整合上述修复,并添加异常捕获方便定位问题:
import os import re import pandas as pd for sheet_name in xls.sheet_names: try: df = pd.read_excel(xls, sheet_name=sheet_name, dtype=str, keep_default_na=False) # 清洗工作表名称 clean_sheet_name = re.sub(r'[\\/*?:"<>|]', '_', sheet_name) # 简化CSV文件名 csv_file_name = f"{clean_sheet_name}.csv" sheet_folder_path = os.path.join(processed_directory, clean_sheet_name) # 自动创建文件夹(已存在则跳过) os.makedirs(sheet_folder_path, exist_ok=True, mode=0o775) csv_file_path = os.path.join(sheet_folder_path, csv_file_name) # 指定编码写入CSV df.to_csv(csv_file_path, index=False, sep='~', encoding='utf-8-sig') except Exception as e: # 打印错误信息并记录日志 print(f"处理工作表 {sheet_name} 时出错: {str(e)}") with open("csv_export_error_log.txt", "a", encoding="utf-8") as f: f.write(f"{pd.Timestamp.now()} | 工作表: {sheet_name} | 错误信息: {str(e)}\n")
额外排查技巧
- 手动检查出错的Excel文件,确认工作表名是否有特殊字符、数据是否存在异常内容
- 在生产环境运行时,打印出错的
csv_file_path,检查路径是否合法、长度是否超标 - 单独提取出错的文件进行测试,缩小排查范围
内容的提问来源于stack exchange,提问作者Surekha Rajendran
相关产品推荐
相关产品推荐

