Ubuntu服务器与Windows的os.listdir返回文件顺序不一致问题
问题成因
Python官方文档明确规定os.listdir()返回的文件名列表顺序不做任何保证,顺序完全由底层操作系统的文件系统实现决定:
- Windows平台的NTFS文件系统默认会按文件名字典序返回目录项,你本地运行符合预期只是刚好匹配了系统特性,属于巧合,不是规范层面的稳定行为。
- Ubuntu常用的ext4、xfs等文件系统,返回的目录项顺序由inode写入顺序、目录项存储结构决定,不会自动按文件名排序,因此直接取列表最后一位的结果不符合预期。
解决方法
必须对os.listdir()的返回结果做显式排序后再取值,不要依赖操作系统的默认返回顺序:
- 如果文件名的命名规则(年份+季度)本身的字典序和时间顺序一致,直接排序即可,示例代码如下:
import os filenames = os.listdir(edgar_path) # 可选步骤:过滤掉目录,只保留文件避免干扰 filenames = [f for f in filenames if os.path.isfile(os.path.join(edgar_path, f))] # 显式按文件名排序 filenames_sorted = sorted(filenames) last_file = filenames_sorted[-1]
- 如果文件名规则更复杂,字符串顺序和时间顺序不匹配,可以自定义排序的key函数,提取时间维度排序:
import re def parse_file_time(filename): # 适配xxxxQx格式的文件名,例如2024Q2 match_res = re.match(r'(\d{4})Q([1-4])', filename) if not match_res: return (0, 0) return (int(match_res.group(1)), int(match_res.group(2))) filenames_sorted = sorted(filenames, key=parse_file_time) last_file = filenames_sorted[-1]
- 如果需要按文件实际的修改/创建时间取最新,而非按文件名判断,可按文件属性排序:
# 按最后修改时间排序,最新的排在末尾 filenames_sorted = sorted(filenames, key=lambda x: os.path.getmtime(os.path.join(edgar_path, x))) last_file = filenames_sorted[-1]
内容的提问来源于stack exchange,提问作者Prosy A.
相关产品推荐
相关产品推荐

