目录文件按创建时间排序异常及文件计数逻辑问题求助
解决磁盘空间超限自动删除最旧文件的两个核心问题
咱们先逐个拆解你遇到的两个问题,再给出修复后的完整代码:
问题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
相关产品推荐
相关产品推荐

