如何按名称正确排序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.pdbsplit('_')[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里的2ASCII值小,所以会被排在前面。转成整数后排序,就会遵循数字的大小逻辑啦。
内容的提问来源于stack exchange,提问作者user14748664
相关产品推荐
相关产品推荐

