Python按第二列日期批量排序CSV内容 支持覆盖或另存
CSV 日期排序可实现方案
原代码未生效的核心问题
- 直接将CSV第二列的日期字符串做字典序排序、同时开启了
reverse=True反向排序,既无法准确识别DD/MM/YYYY格式的真实日期先后,排序方向也和需求完全相反 - 仅将排序结果存在内存字典中,没有任何写回文件的逻辑,不会对原始文件做任何修改,也不会生成新的输出文件
- 未实现需求要求的“优先覆盖原文件、覆盖失败则存入Sorted目录”的分支逻辑
修正后可直接运行的代码
import csv import glob import os from datetime import datetime # 路径配置 ORIGINAL_FOLDER = "Original" SORTED_FOLDER = "Sorted" # 匹配CSV中使用的DD/MM/YYYY日期格式 DATE_PARSE_FORMAT = "%d/%m/%Y" # 提前创建Sorted存储目录,不存在则自动生成 os.makedirs(SORTED_FOLDER, exist_ok=True) # 遍历Original目录下所有CSV文件 for csv_full_path in glob.glob(os.path.join(ORIGINAL_FOLDER, "*.csv")): # 读取文件全部行 with open(csv_full_path, "r", encoding="utf-8") as file_handle: csv_reader = csv.reader(file_handle, delimiter=",") all_rows = list(csv_reader) # 按第二列日期升序排序:将日期字符串转为可比较的时间对象作为排序键 sorted_rows = sorted( all_rows, key=lambda single_row: datetime.strptime(single_row[1].strip(), DATE_PARSE_FORMAT) ) # 优先尝试覆盖原文件 try: with open(csv_full_path, "w", encoding="utf-8", newline="") as write_handle: csv_writer = csv.writer(write_handle) csv_writer.writerows(sorted_rows) print(f"排序完成,已覆盖原文件:{csv_full_path}") # 遇到无权限、文件被占用等无法写入原文件的情况 except PermissionError: # 保存到Sorted目录,保留原文件名 save_path = os.path.join(SORTED_FOLDER, os.path.basename(csv_full_path)) with open(save_path, "w", encoding="utf-8", newline="") as write_handle: csv_writer = csv.writer(write_handle) csv_writer.writerows(sorted_rows) print(f"原文件无写入权限,排序结果已保存至:{save_path}")
功能匹配说明
- 排序逻辑完全匹配示例规则:解析后按真实日期先后升序排列,最早日期的行排在最前,跨月、跨年的日期排序不会出现错位
- 写入逻辑完全匹配需求优先级:先尝试覆盖原文件,遇到权限不足、文件被占用等无法覆盖的场景,自动将排序后的文件存入Sorted独立目录
- 自动适配运行环境:写入时添加
newline=""参数,避免Windows系统下生成的CSV文件出现多余空行;Sorted目录自动创建,无需手动提前配置 - 兼容示例中的无表头CSV格式,不需要额外调整读取逻辑
内容的提问来源于stack exchange,提问作者Joao
相关产品推荐
相关产品推荐

