Python如何获取目录文件列表按时间倒序,同时规避断链的FileNotFoundError
解决失效符号链接下的文件按修改时间排序问题
你的代码存在两个核心问题:
- 使用
max()只会返回单个最新文件,无法实现所有文件按逆时间顺序列出的需求; os.path.getmtime()会跟随符号链接访问目标文件,失效链接会直接触发FileNotFoundError,而max()在遍历计算key时一旦遇到异常就会终止执行。
下面提供两种针对性的解决方案:
方案1:跳过失效符号链接,按目标文件时间排序
自定义一个安全获取修改时间的函数,捕获失效链接的异常,将这类文件标记后过滤掉,再对有效文件排序:
import glob import os def safe_get_target_mtime(path): try: # 获取符号链接指向文件的修改时间(若为普通文件则直接获取自身时间) return os.path.getmtime(path) except FileNotFoundError: # 失效链接返回极小值,后续可过滤 return float('-inf') # 按修改时间逆序排序所有匹配文件 all_files = sorted(glob.iglob("*release*.log"), key=safe_get_target_mtime, reverse=True) # 过滤掉失效的符号链接 valid_files = [file for file in all_files if safe_get_target_mtime(file) != float('-inf')] for file_name in valid_files: print(f"filename = {file_name}")
方案2:获取符号链接自身的修改时间(无需依赖目标文件)
如果你的需求是按符号链接本身的创建/修改时间排序,而非目标文件的时间,可使用os.lstat()(不跟随符号链接),这样即使链接失效也不会报错:
import glob import os def get_link_self_mtime(path): # 获取符号链接自身的修改时间,不受目标文件状态影响 return os.lstat(path).st_mtime # 按链接自身修改时间逆序排序所有匹配文件 sorted_files = sorted(glob.iglob("*release*.log"), key=get_link_self_mtime, reverse=True) for file_name in sorted_files: print(f"filename = {file_name}")
补充说明
原代码中max()的使用场景是获取单个最大值,若要批量排序必须用sorted();同时异常处理需要包裹在key函数内部,才能在遍历每个文件时单独处理异常,避免程序终止。
内容的提问来源于stack exchange,提问作者A.G.Progm.Enthusiast
相关产品推荐
相关产品推荐

