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

如何获取指定目录下所有.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:06:03