Python使用os.listdir如何按1到15的数字顺序读取目录文件
问题原因
os.listdir()返回的文件名是字符串类型,默认排序遵循ASCII字典序规则,字符串"10"的首字符"1"的ASCII码小于"2"的ASCII码,因此会出现1、1015排在29前面的情况。
- 额外提示:如果只需要读取文件、排除目录,可先对文件名单做过滤:
file_names = [x for x in os.listdir() if os.path.isfile(x)]
实现数字顺序读取的方法
通过sorted()函数的key参数自定义排序规则,将文件名中的数字部分转为整数作为排序依据即可。
场景1:文件为纯数字命名(无后缀)
import os file_names = os.listdir() # 按文件名转整数后的数值排序 sorted_file_names = sorted(file_names, key=lambda x: int(x)) # 生成绝对路径列表 files_path = [os.path.abspath(x) for x in sorted_file_names]
场景2:文件带后缀(如1.txt、2.docx)
需要先提取文件名前缀再转整数:
import os file_names = os.listdir() # os.path.splitext会把文件名拆分为(前缀, 后缀)元组 sorted_file_names = sorted(file_names, key=lambda x: int(os.path.splitext(x)[0])) files_path = [os.path.abspath(x) for x in sorted_file_names]
可选优化:过滤非数字命名的文件
如果目录下存在不符合数字命名规则的文件,可以加异常处理避免报错:
import os def parse_file_sort_key(file_name): try: # 提取数字前缀作为排序依据 return int(os.path.splitext(file_name)[0]) except ValueError: # 非数字命名的文件默认排到最后,也可以自行调整规则 return float('inf') file_names = os.listdir() sorted_file_names = sorted(file_names, key=parse_file_sort_key) # 如需完全过滤非数字命名的文件,添加如下代码 # sorted_file_names = [f for f in sorted_file_names if parse_file_sort_key(f) != float('inf')] files_path = [os.path.abspath(x) for x in sorted_file_names]
内容的提问来源于stack exchange,提问作者david。
相关产品推荐
相关产品推荐

