Python中如何对含整数与字符串的路径列表按最后下划线后整数排序?
解决路径按最后一个下划线后整数排序的问题
你的问题出在排序的key函数上——当前代码试图把目录路径直接转成整数,这显然不对,因为路径里包含大量非数字字符(比如下划线、横杠、目录分隔符),自然没法正确按最后一个下划线后的整数排序。
要实现需求,我们需要精准提取每个路径中最后一个下划线后面的整数,把它作为排序依据。下面分两种常见场景给出解决方案:
场景1:目标整数在文件名里(比如文件是tmp_1483228800-1485907200_0.csv)
如果glob匹配到的是直接带有_0、_1后缀的CSV文件,可按以下逻辑处理:
import glob import os act = "./*/*.csv" # 匹配所有子目录下的CSV文件,可根据实际路径调整 files = glob.glob(act) def get_sort_key(file_path): # 1. 从完整路径中提取文件名(比如从"./subdir/tmp_xxx_0.csv"得到"tmp_xxx_0.csv") filename = os.path.basename(file_path) # 2. 去掉文件扩展名,得到纯文件名主体("tmp_xxx_0") filename_no_ext = os.path.splitext(filename)[0] # 3. 从末尾开始按下划线分割1次,取最后一部分转成整数 return int(filename_no_ext.rsplit('_', 1)[-1]) sorted_list = sorted(files, key=get_sort_key)
场景2:目标整数在目录名里(比如路径是./tmp_1483228800-1485907200_0/raw_results.csv)
如果glob匹配的是子目录下的raw_results.csv,且目标整数在父目录名的末尾,调整提取逻辑即可:
import glob import os act = "./*/raw_results.csv" files = glob.glob(act) def get_sort_key(file_path): # 1. 从完整路径中提取目录部分(比如从"./tmp_xxx_0/raw_results.csv"得到"./tmp_xxx_0") dir_path = os.path.dirname(file_path) # 2. 提取目录的名称(得到"tmp_xxx_0") dir_name = os.path.basename(dir_path) # 3. 从末尾开始按下划线分割1次,取最后一部分转成整数 return int(dir_name.rsplit('_', 1)[-1]) sorted_list = sorted(files, key=get_sort_key)
关键细节说明
- 用
rsplit('_', 1)而非split('_'):只会从字符串末尾分割一次,确保我们取到的是最后一个下划线后的内容,避免文件名/目录名中前面的下划线干扰结果。 - 先提取文件名/目录名再处理:过滤掉路径中的目录分隔符、无关字符,确保只处理我们需要的目标部分。
如果需要倒序排序,只需在sorted函数中添加reverse=True参数即可。
内容的提问来源于stack exchange,提问作者Maryam Nahid
相关产品推荐
相关产品推荐

