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
相关产品推荐
相关产品推荐

