Python合并多CSV文件排序失效致日期列无序问题求助
解决CSV文件合并时的排序失效问题
你遇到的核心问题是字符串字典序排序与数字自然排序的差异:sorted()默认按字符串逐个字符比较,文件名中的数字会被当作字符串处理,导致"10"排在"2"前面,最终合并后的日期列数据无序。
修改后的代码
import os import pandas as pd # 使用原始字符串避免Windows路径的转义问题 file_path = r"C:\Users\PROJECT\Data Set\SMS Data\" # 获取目标文件列表,用os.path.join拼接路径更安全 file_list = [os.path.join(file_path, f) for f in os.listdir(file_path) if f.startswith('call. sms ')] # 自定义排序键:提取文件名中的数字转为整数 def get_file_number(file_path): file_name = os.path.basename(file_path) # 移除文件名中的固定前缀和后缀,提取数字部分 num_str = file_name.replace('call. sms ', '').rstrip('.csv') return int(num_str) # 按数字大小对文件列表排序 sorted_files = sorted(file_list, key=get_file_number) csv_list = [] for file in sorted_files: csv_list.append(pd.read_csv(file).assign(File_Name=os.path.basename(file))) csv_merged = pd.concat(csv_list, ignore_index=True) csv_merged.to_csv(os.path.join(file_path, 'calls.sms.merged.csv'), index=False)
关键改进点
- 路径处理:用
os.path.join()替代字符串拼接路径,避免不同系统路径分隔符的兼容问题;用原始字符串r"..."解决Windows路径反斜杠的转义错误。 - 自然排序:通过自定义
get_file_number函数提取文件名中的数字并转为整数,让sorted()按数字大小而非字符串字典序排序,确保文件按1→2→…→9→10→11…的顺序合并。
通用适配方案(文件名格式多变时)
如果文件名中的数字位置不固定,可改用正则表达式提取数字:
import re def get_file_number(file_path): file_name = os.path.basename(file_path) # 匹配文件名中的所有连续数字,取第一个匹配结果 match = re.search(r'\d+', file_name) return int(match.group()) if match else 0
内容的提问来源于stack exchange,提问作者Maryam Faheem
相关产品推荐
相关产品推荐

