如何使用glob匹配指定编号前缀文件,避免file1与file10被同时匹配
问题根因
你使用的*通配符匹配规则过于宽松,file1*会命中所有以file1开头的文件名,file10满足该规则因此会被误匹配。我们只要限定数字后缀的匹配规则即可解决问题。
方案1:循环匹配当前序号对应文件(适配原有代码逻辑)
调整匹配规则,仅匹配两类文件:精确匹配当前序号的主文件、当前序号加下划线开头的衍生文件,同时用os.path.join做路径拼接避免跨平台适配问题:
import glob import os for iter in range(number_of_files): current_num = iter + 1 # 匹配主文件 fileN main_file = glob.glob(os.path.join(file_directory, f"file{current_num}")) # 匹配衍生文件 fileN_xxx sub_files = glob.glob(os.path.join(file_directory, f"file{current_num}_*")) # 合并结果并按衍生序号排序 find_matching_files = main_file + sorted(sub_files, key=lambda x: int(x.rsplit('_', 1)[-1]))
方案2:一次性全量匹配后自定义排序(无需提前知道文件总数)
如果不想提前确认number_of_files的数值,可以一次性捞出所有符合命名规则的文件,通过自定义排序规则直接得到目标遍历顺序:
import glob import os all_files = glob.glob(os.path.join(file_directory, "file*")) def get_sort_key(file_path): # 提取文件名去掉前缀file后的部分 num_part = os.path.basename(file_path)[4:] if '_' in num_part: main_num, sub_num = num_part.split('_', 1) return (int(main_num), int(sub_num)) return (int(num_part), 0) # 排序后的列表顺序完全符合要求:file1、file1_1、file2、file2_1…… sorted_files = sorted(all_files, key=get_sort_key)
内容的提问来源于stack exchange,提问作者Maxim
相关产品推荐
相关产品推荐

