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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:24:06