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

Python CSV对比脚本文件名适配问题:carre123.csv无法正常对比

按修改时间对比CSV文件时,特定文件名导致脚本失效的问题修复

我写了一段Python脚本,用来把目录里最新的CSV文件和其他所有CSV文件对比,移除最新文件里和其他文件重复的行,剩下的写入新文件。但遇到奇怪的问题:当最新文件名叫carre123.csv时对比逻辑失效,改成test123.csv就能正常运行。

原代码如下:

import os
import pandas as pd

# Set the directory where the CSV files are stored
directory = '/PATH/csv-files'

# Get a list of all the CSV files in the directory
csv_files = [os.path.join(directory, f) for f in os.listdir(directory) if f.endswith('.csv')]
#print(csv_files)

# Sort the CSV files by modification time and select the last file as the latest file
latest_file = sorted(csv_files, key=os.path.getmtime)[-1]
#print(latest_file)

# Read the contents of the latest CSV file into a pandas DataFrame
latest_data = pd.read_csv(latest_file)
#print(latest_data)

# Iterate over all the previous CSV files
for csv_file in csv_files[:-1]:
    # Read the contents of the previous CSV file into a pandas DataFrame
    prev_data = pd.read_csv(csv_file)
    #print(prev_data)

    # Identify the rows in the latest CSV file that match the rows in the previous CSV file
    matches = latest_data.isin(prev_data.to_dict('list')).all(axis=1)
    print(matches)

    # Remove the matching rows from the latest CSV file
    latest_data = latest_data[~matches]

# Write the remaining rows in the latest CSV file to a new file
latest_data.to_csv('/NEWPATH/diff.csv', index=False)

问题根源

脚本的核心bug是文件列表排序不一致:

  • os.listdir返回的文件顺序是系统依赖的(一般是文件名字典序),不是按修改时间排序的。
  • 你通过sorted(csv_files, key=os.path.getmtime)[-1]拿到了最新修改的文件,但后续循环用的csv_files[:-1]是原未排序列表去掉最后一个元素,这和“除了最新文件之外的所有文件”完全不是一回事。
  • 当文件名是test123.csv时,它刚好在原os.listdir列表的最后,所以csv_files[:-1]碰巧是正确的对比文件集合;但carre123.csv在原列表里不是最后一个,导致循环要么漏掉了应该对比的文件,要么错误地把最新文件也包含进去,最终对比逻辑失效。

修复后的代码

先把所有CSV文件按修改时间排序,再从排序后的列表里拆分最新文件和剩余文件,确保循环的是正确的对比对象:

import os
import pandas as pd

# 存储CSV文件的目录
directory = '/PATH/csv-files'

# 获取目录下所有CSV文件的路径
csv_files = [os.path.join(directory, f) for f in os.listdir(directory) if f.endswith('.csv')]

# 按文件修改时间排序,确保顺序正确
sorted_csv_files = sorted(csv_files, key=os.path.getmtime)
# 最新文件是排序后的最后一个元素
latest_file = sorted_csv_files[-1]
# 剩余需要对比的文件是排序后的前n-1个元素
previous_files = sorted_csv_files[:-1]

# 读取最新文件数据
latest_data = pd.read_csv(latest_file)

# 遍历所有历史文件进行对比去重
for csv_file in previous_files:
    prev_data = pd.read_csv(csv_file)
    # 找出最新文件中与当前历史文件重复的行
    matches = latest_data.isin(prev_data.to_dict('list')).all(axis=1)
    # 移除重复行
    latest_data = latest_data[~matches]

# 将去重后的数据写入新文件
latest_data.to_csv('/NEWPATH/diff.csv', index=False)

额外优化建议

  • 如果CSV文件有唯一标识的主键列(比如id),用主键对比会比全列匹配更高效准确,示例代码:
    # 替换原matches和去重逻辑,假设主键列是'id'
    duplicate_ids = latest_data.merge(prev_data, on='id', how='inner')['id']
    latest_data = latest_data[~latest_data['id'].isin(duplicate_ids)]
    
  • 可以添加边界判断:如果目录下没有CSV文件或只有一个CSV文件,直接输出原文件或提示,避免索引错误。

内容的提问来源于stack exchange,提问作者naim abbasi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:23:17