Django视图中os.listdir读取的CSV文件如何按日期倒序排序
解决方案
你之前使用sorted()未生效是因为直接对文件名字符串排序,默认的字符串排序规则无法识别文件名里的日期结构,会出现逻辑错误。我们只需要从文件名提取日期转成可比较的时间对象再排序即可,整个过程在内存完成,不会修改目录内原有文件顺序。
完整修改后代码
import os from datetime import datetime from django.conf import settings def vm_schedule_download(request): media_url = settings.MEDIA_ROOT export_dir = os.path.join(media_url, 'appli', 'vm', 'schedule_export') # 用exist_ok参数简化多层目录创建逻辑,无需多次判断 os.makedirs(export_dir, exist_ok=True) all_files = os.listdir(export_dir) valid_csv = [] for filename in all_files: # 只处理符合命名规则的csv文件 if filename.startswith('export_') and filename.endswith('.csv'): try: # 提取时间部分:去掉前缀export_和后缀.csv time_str = filename[len('export_') : -len('.csv')] # 按你给出的文件名格式转成datetime对象:日_月_年-时分秒 file_time = datetime.strptime(time_str, '%d_%m_%Y-%H%M%S') valid_csv.append((file_time, filename)) except ValueError: # 格式不符合的文件直接跳过,避免程序报错 continue # 按时间倒序排序,最新文件排在最前,最终只提取文件名返回模板 valid_csv.sort(reverse=True, key=lambda x: x[0]) filenames = [item[1] for item in valid_csv] return render(request, 'appli/vm/vm_schedule_download.html', {'filenames': filenames})
逻辑说明
- 用
os.path.join拼接路径,避免不同操作系统路径分隔符不一致的兼容问题 - 增加了文件过滤和异常捕获逻辑,避免目录内存在其他格式文件导致程序崩溃
- 提取文件名中的时间字符串转成
datetime对象后再排序,保证日期判断逻辑完全符合预期 reverse=True实现最新日期文件优先展示,整个排序在内存中完成,不会修改原目录的文件存储顺序
内容的提问来源于stack exchange,提问作者Lolm_47
相关产品推荐
相关产品推荐

