Python从目录获取最新csv文件时数字字符串排序错误如何解决
解决session文件名按字符串排序错乱问题
你遇到的问题本质是字符串字典序排序和人类认知的自然排序逻辑不匹配:字符串比较时是逐位对比字符的ASCII码值,session-10000的第8位是1,session-9999的第8位是9,因此session-10000会被排在最前面,不符合按编号大小排序的预期。
你需要自定义排序规则,提取文件名中session-后面的数字转为整数,再按整数大小排序,即可得到正确的先后顺序。
代码修改步骤
- 首先导入正则表达式模块用于提取编号:
import re
- 替换原来直接取glob结果末尾元素的逻辑,新增自定义排序环节:
原来的代码行:
last_client_session.append(glob.glob(client_folder + '/Sessies/*.csv')[-1])
替换为以下逻辑:
# 获取该路径下所有csv文件 csv_files = glob.glob(client_folder + '/Sessies/*.csv') # 定义提取session编号的排序key函数 def extract_session_id(file_path): # 从路径中提取纯文件名 filename = os.path.basename(file_path) # 匹配文件名中session-后的数字部分,忽略大小写适配可能的命名差异 match_res = re.search(r'session-(\d+)', filename, re.IGNORECASE) if match_res: # 匹配成功返回数字的整数格式,作为排序依据 return int(match_res.group(1)) # 匹配不到规则的文件默认排到最前,避免程序报错 return 0 # 按session编号从小到大排序,取最后一个即为编号最大的最新会话 sorted_csv_files = sorted(csv_files, key=extract_session_id) last_client_session.append(sorted_csv_files[-1])
补充说明
- 如果确认所有文件名都是严格的小写
session-数字.csv格式,可以去掉re.IGNORECASE参数提升匹配效率 - 如果需要适配其他命名规则,只需要调整正则表达式的匹配规则即可
内容的提问来源于stack exchange,提问作者Dwayne Dillen
相关产品推荐
相关产品推荐

