读取最新CSV文件创建file_name列时触发KeyError错误求助
解决新增file_name列时触发KeyError的问题
我尝试从本地文件夹读取两个最新的.csv文件,给每个读取后的DataFrame新增file_name列存储对应文件名,但运行代码时一直触发KeyError: 'file_name'错误,相关代码如下:
files = glob.glob(r"path\*.csv") sorted_files = sorted(files, key=os.path.getmtime, reverse = True) #按修改时间从新到旧排序文件 buyandsell_df = [] for index, file in enumerate(sorted_files): if index == 2: #仅从排序后的文件列表中打开两个最新文件 break else: print("READING IN " + file) df = pd.read_csv(file, usecols=['language','title','contract_number','publishing_status','award_date','publication_date','amendment_date','contract_value'], low_memory = False) df['file_name'] = file df = df.loc[df['language'] == 'English'] #过滤法语重复项 buyandsell_df.append(df)
可能的原因及修复方案
循环逻辑优化
原代码中if index == 2: break虽然能实现读取前两个文件,但逻辑不够直观,换成index >= 2更清晰,避免因循环计数误解导致的问题。列读取流程调整
原代码用usecols直接指定列读取,若某个csv文件缺少指定列,可能引发后续异常。调整为先读取全部列再筛选需要的列,能更灵活处理列缺失的情况,同时确保file_name列添加后稳定存在。修改后的代码
import glob import os import pandas as pd files = glob.glob(r"path\*.csv") sorted_files = sorted(files, key=os.path.getmtime, reverse=True) buyandsell_df = [] for index, file in enumerate(sorted_files): if index >= 2: # 读取前两个最新文件,逻辑更清晰 break print(f"READING IN {file}") # 先读取全部列,再筛选需要的列,避免usecols导致的列缺失问题 df = pd.read_csv(file, low_memory=False) # 定义需要保留的列,确保后续操作有可靠的数据基础 required_cols = ['language','title','contract_number','publishing_status','award_date','publication_date','amendment_date','contract_value'] # 筛选列,若csv中缺少某列,会自动填充NaN,避免直接报错 df = df[required_cols] # 添加文件名列,此时df一定存在该列 df['file_name'] = file # 过滤英文条目 df = df[df['language'] == 'English'] buyandsell_df.append(df)
- 额外排查点
- 检查
print输出的文件路径是否正确,确保glob确实读取到了目标csv文件; - 若仍报错,可在添加
file_name列后加入print(df.columns),确认该列是否存在; - 检查目标csv文件是否为空,空文件读取后添加列仍会保留列名,后续操作不会触发KeyError,但如果有合并等操作,可提前跳过空文件。
内容的提问来源于stack exchange,提问作者Mitch
相关产品推荐
相关产品推荐

