如何按文件名中的数字对目录内文件进行排序?
这个问题很常见——你碰到的是字符串字典序排序和数字数值排序的差异!os.listdir()返回的文件名都是字符串类型,Python默认的sorted()会按照字符串的字典顺序来排列,所以"10.txt"会排在"2.txt"前面(因为字符'1'的ASCII码比'2'小)。
要实现按数字升序排列,核心是让排序时以文件名里的数字值为依据,而不是字符串本身。这里有几种简单可靠的方法:
方法1:提取文件名中的数字作为排序键
最直接的方式是用sorted()的key参数,自定义一个函数提取文件名里的数字部分并转为整数:
import os filepath = "/你的目录路径/" # 按文件名中的数字值排序 sorted_files = sorted(os.listdir(filepath), key=lambda x: int(x.split('.')[0])) for file in sorted_files: print(file)
这里的lambda x: int(x.split('.')[0])会把每个文件名按.分割,取前面的数字字符串(比如"100.txt"变成"100"),再转换成整数,这样排序时就会按照数字大小来排列了。
方法2:用os.path.splitext更稳妥地处理扩展名
如果担心文件名里出现多个.(虽然你的场景里没有),可以用os.path.splitext来更安全地分离文件名和扩展名:
import os filepath = "/你的目录路径/" sorted_files = sorted(os.listdir(filepath), key=lambda x: int(os.path.splitext(x)[0])) for file in sorted_files: print(file)
os.path.splitext(x)会返回一个元组(文件名, 扩展名),比如对"100.txt"会返回("100", ".txt"),取第一个元素就是纯数字字符串,转成整数后作为排序依据。
额外优化:过滤不符合规则的文件
如果目录里可能存在非数字.txt格式的文件,可以先过滤再排序,避免转换整数时出错:
import os filepath = "/你的目录路径/" # 先过滤出符合规则的文件:以.txt结尾,且文件名部分是纯数字 valid_files = [f for f in os.listdir(filepath) if f.endswith('.txt') and f.split('.')[0].isdigit()] # 再按数字排序 sorted_files = sorted(valid_files, key=lambda x: int(os.path.splitext(x)[0])) for file in sorted_files: print(file)
这样处理后,就能完美得到你想要的0.txt 1.txt 2.txt ...的排序结果啦!
内容的提问来源于stack exchange,提问作者StevePick
相关产品推荐
相关产品推荐

