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

如何按名称正确排序glob获取的model_*.pdb文件列表?

解决带数字文件名的排序问题

这个坑我之前踩过!默认的字符串字典序排序确实会把model_10.pdb排在model_2.pdb前面,咱们只需要给sorted()指定一个按数字排序的key就能轻松搞定。

方法一:通过字符串拆分提取数字

这种方法适合文件名格式固定的情况(比如你的model_数字.pdb),直接拆分字符串提取数字转成整数作为排序依据:

import glob
import os

pdbs = "你的目标文件夹路径"
# 先按数字排序完整路径,再提取文件名
pdb_list2 = [
    os.path.basename(p) 
    for p in sorted(
        glob.glob(os.path.join(pdbs, '*.pdb')),
        key=lambda x: int(os.path.basename(x).split('_')[1].split('.')[0])
    )
]

代码解释:

  • os.path.basename(x) 取出路径中的文件名,比如model_1.pdb
  • split('_')[1] 拆分出1.pdb,再split('.')[0]得到纯数字字符串1
  • 转成int类型后,排序就会按数字大小而非字符串字典序来执行

方法二:用正则表达式提取数字(更灵活)

如果后续文件名格式有小变动(比如数字位数变化、前缀调整),用正则提取数字会更稳健:

import glob
import os
import re

def get_model_number(filename):
    # 精准匹配model_后面的数字部分
    num_match = re.search(r'model_(\d+)\.pdb', filename)
    return int(num_match.group(1)) if num_match else 0

pdbs = "你的目标文件夹路径"
pdb_list2 = [
    os.path.basename(p) 
    for p in sorted(
        glob.glob(os.path.join(pdbs, '*.pdb')),
        key=lambda x: get_model_number(os.path.basename(x))
    )
]

为什么原来的代码会出错?

字符串默认的排序是字典序:逐个字符比较,model_10.pdb里的第二个关键字符是1,比model_2.pdb里的2 ASCII值小,所以会被排在前面。转成整数后排序,就会遵循数字的大小逻辑啦。

内容的提问来源于stack exchange,提问作者user14748664

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:42:16