Python批量读取CSV合并DataFrame时,如何通过Try-Except捕获错误并跳过异常文件?
解决CSV合并时跳过出错文件的问题
你遇到的核心问题是:原来的列表推导式是表达式级别的写法,没法直接在里面加try-except语句块,得把单个CSV的读取逻辑封装成一个带异常处理的函数才行。
具体解决方案
首先,我们定义一个安全读取CSV的函数,遇到错误时打印提示并返回None,这样后续可以过滤掉无效的结果:
import pandas as pd import os def read_csv_safe(file_path): try: # 这里可以根据需要添加read_csv的其他参数,比如sep、header等 return pd.read_csv(file_path) except Exception as e: # 打印错误信息方便排查哪个文件出了问题 print(f"⚠️ 无法读取文件 {file_path}: {str(e)}") return None
然后,我们用这个函数来批量读取文件,过滤掉读取失败的结果,再合并:
export = "你的目标目录路径" # 先过滤出目录下所有CSV文件(避免读取非CSV文件导致额外错误) csv_files = [ os.path.join(export, filename) for filename in os.listdir(export) if filename.lower().endswith('.csv') # 用lower()兼容大小写不同的后缀,比如.CSV ] # 读取所有有效CSV,过滤掉返回None的结果 valid_dataframes = [ df for df in (read_csv_safe(file) for file in csv_files) if df is not None ] # 合并所有有效DataFrame combined_csv = pd.concat(valid_dataframes, ignore_index=True)
为什么这个方案可行?
- 异常处理封装:把
pd.read_csv放到函数里,用try-except捕获所有读取时的异常(包括你遇到的UnicodeDecodeError),出错时返回None而不是中断整个程序。 - 过滤非CSV文件:通过
endswith('.csv')过滤文件,避免目录里的临时文件、二进制文件或其他格式文件触发不必要的错误。 - 高效过滤无效结果:用生成器表达式
(read_csv_safe(file) for file in csv_files)读取文件,再用列表推导式过滤掉None,只保留有效DataFrame进行合并。
额外优化建议
如果想尝试兼容不同编码的文件(而不是直接跳过),可以在read_csv_safe里尝试多种编码:
def read_csv_safe(file_path): encodings = ['utf-8', 'latin-1', 'gbk'] for encoding in encodings: try: return pd.read_csv(file_path, encoding=encoding) except UnicodeDecodeError: continue print(f"❌ 所有编码尝试失败,无法读取文件 {file_path}") return None
这样会先尝试UTF-8,不行再试Latin-1、GBK,实在不行才跳过,能减少不必要的文件跳过。
内容的提问来源于stack exchange,提问作者RCarmody
相关产品推荐
相关产品推荐

