如何获取指定目录下所有.txt格式文件名且不触发自动排序
解决方案
问题根因
你遇到的乱序问题来自三种写法的不同逻辑:
glob.glob()默认对返回结果做字典序排序,所以会出现file10.txt排在file2.txt前面的情况- 你写的
fnmatch.filter和endswith列表推导式本身不会修改os.listdir()返回的原生顺序,若出现乱序可检查是否后续对结果执行了排序操作
方案1:直接基于os.listdir筛选(最稳妥,完全保留原生顺序)
你已经确认os.listdir()返回顺序符合要求,直接遍历筛选即可,不会改变原有顺序:
import os sourdir = "你的目标文件夹路径" # 写法1:循环筛选 txt_files = [] for filename in os.listdir(sourdir): # 可加.lower()同时匹配.TXT大写后缀,不需要可直接删掉 if filename.lower().endswith(".txt"): txt_files.append(filename) # 写法2:等价的列表推导式,和循环逻辑完全一致 txt_files = [f for f in os.listdir(sourdir) if f.endswith(".txt")]
方案2:使用glob关闭排序功能
如果你习惯用glob写法,Python 3.5及以上版本支持给glob.glob()添加sort=False参数,关闭默认排序,返回文件的原生顺序:
import glob import os sourdir = "你的目标文件夹路径" # 返回带完整路径的文件名 txt_files = glob.glob(f"{sourdir}/*.txt", sort=False) # 如果只需要纯文件名,加一步处理即可 txt_filenames = [os.path.basename(f) for f in txt_files]
补充可选:自然数字排序
如果你后续需要按文件名内的数字大小排序(即file2.txt排在file10.txt前面),可以用自定义排序规则实现:
import re def natural_sort_key(s): return [int(text) if text.isdigit() else text.lower() for text in re.split(r'(\d+)', s)] txt_files.sort(key=natural_sort_key)
内容的提问来源于stack exchange,提问作者chang thenoob
相关产品推荐
相关产品推荐

