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

目录文件按创建时间排序异常及文件计数逻辑问题求助

解决磁盘空间超限自动删除最旧文件的两个核心问题

咱们先逐个拆解你遇到的两个问题,再给出修复后的完整代码:

问题1:排序后无法获取真正最旧的文件

你用files = sorted(os.listdir(DIR), key=os.path.getctime)得到的列表不对,核心原因是**os.listdir只返回文件名,而os.path.getctime默认会在当前工作目录下查找文件**。如果你的脚本运行目录不是DIR指定的目录,那获取的创建时间根本不是目标目录里文件的时间,排序自然就错了。

修复方案

排序时要把文件名和目标目录拼接成完整路径,这样才能正确获取每个文件的创建时间:

files = sorted(os.listdir(DIR), key=lambda filename: os.path.getctime(os.path.join(DIR, filename)))

另外,删除文件的时候也要用完整路径,避免因工作目录不一致删错文件:

oldest_file_path = os.path.join(DIR, files[0])
os.remove(oldest_file_path)
print('Deleted oldest file: ', files[0])

问题2:文件计数跳过,本该生成file_22却生成file_23

这个问题出在你的i += 1位置——不管你这一轮循环是成功保存了文件,还是进入删除分支没保存文件,i都会加1。比如当磁盘满了进入else分支,你没生成新文件,但i还是从22变成了23,下一轮循环就直接生成file_23,跳过了file_22。

修复方案

把i += 1移到if分支内部,也就是只有成功保存文件的时候,才让计数递增:

if (used < 50): # 50 MB
    print('Saving file_{}'.format(i))
    with open(os.path.join(DIR, "file_{}".format(i)), 'wb') as f:
        f.write(os.urandom(FILE_SIZE))
    i = i + 1  # 只有保存成功才递增计数
else:
    # 处理删除逻辑,不修改i
    ...

修复后的完整代码

import os
import psutil
import time

DIR = "./your_target_directory"  # 记得替换成你的目标目录
FILES_NUM = 25  # 示例值,根据你的需求调整
MB_FILE_SIZE = 10
FILE_SIZE = MB_FILE_SIZE * 2**20  # 转换为字节
cycle = 1  # 示例循环编号

print('START: Cycle no. ', cycle)
time.sleep(1)
print('Saving {0} files. {1} MB each'.format(FILES_NUM, MB_FILE_SIZE))
i = 1
while (i <= FILES_NUM):  # 改成<=,确保能生成到最后一个文件
    usage = psutil.disk_usage(DIR)
    used = usage.used // (2**20)
    # print('Uzyta pamiec: ', used)
    if (used < 50): # 50 MB
        print('Saving file_{}'.format(i))
        # 用完整路径保存文件,避免工作目录问题
        file_path = os.path.join(DIR, "file_{}".format(i))
        with open(file_path, 'wb') as f:
            f.write(os.urandom(FILE_SIZE))
        i = i + 1
    else:
        # 按创建时间排序,获取最旧文件
        files = sorted(os.listdir(DIR), key=lambda f: os.path.getctime(os.path.join(DIR, f)))
        print('Files list: ', files)
        oldest_file = os.path.join(DIR, files[0])
        os.remove(oldest_file)
        print('Deleted oldest file: ', files[0])
print('KONIEC: Cycle no. ', cycle)
print('Deleting the content of the card...')

额外提个小细节:我把while循环的条件从i < FILES_NUM改成了i <= FILES_NUM,这样当FILES_NUM是25时,能确保生成到file_25,避免少生成一个文件。

内容的提问来源于stack exchange,提问作者Radosław Hryniewicki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:08:27