如何用Python对CSV文件排序并写入新文件(解决首数字排序问题)
解决CSV数字排序只按首位数排序的问题
嘿,我完全懂你踩的这个坑!这是因为Python的csv模块默认会把CSV里的所有内容都当成字符串来读取,直接排序时会按字符串的字典序比较——比如"10"和"2"比,"1"的ASCII码比"2"小,所以"10"会排在"2"前面,完全不是我们要的数值排序效果。
下面给你两种可行的解决方案,按需选择:
方法一:用原生csv模块处理(无需第三方库)
这种方法适合不想额外安装库的场景,核心就是把字符串类型的数字转换成数值类型(int或float)后再排序:
import csv # 1. 读取原CSV文件 with open('input.csv', 'r', newline='', encoding='utf-8') as infile: reader = csv.reader(infile) # 先读取表头(如果你的CSV没有表头,可以跳过这一行) header = next(reader) # 读取数据并转换数字列类型 data_rows = [] for row in reader: # 假设要排序的数字在第1列(索引为0),如果是其他列修改索引即可 try: # 是整数就用int(),是小数就换成float() row[0] = int(row[0]) except ValueError: # 如果遇到非数字内容,可以选择保留原字符串或跳过该行 print(f"跳过非数字行:{row}") continue data_rows.append(row) # 2. 按数值排序:用key指定以转换后的数字列作为排序依据 data_rows.sort(key=lambda x: x[0]) # 3. 写入排序后的新CSV with open('sorted_output.csv', 'w', newline='', encoding='utf-8') as outfile: writer = csv.writer(outfile) # 先写表头(如果有的话) writer.writerow(header) # 写入数据,csv模块会自动把数值转回合适的格式 writer.writerows(data_rows)
关键说明:
- 转换类型时加了
try-except,避免遇到非数字内容导致程序崩溃; sort方法的key参数是核心,它告诉Python用转换后的数值来做排序依据,而不是原字符串。
方法二:用Pandas快速处理(更简洁)
如果你可以安装第三方库,Pandas会让这个任务变得超级简单,它能自动识别数值类型,排序逻辑也更直观:
首先安装Pandas(如果没装的话):
pip install pandas
然后运行代码:
import pandas as pd # 读取CSV,指定数字列的类型(避免被识别为字符串) # 把'数字列名'换成你实际的列名,比如'price'、'id' df = pd.read_csv('input.csv', dtype={'数字列名': int}) # 小数就用float # 按指定列排序,ascending=True是升序,False是降序 sorted_df = df.sort_values(by='数字列名', ascending=True) # 写入新CSV,index=False是去掉自动生成的索引列 sorted_df.to_csv('sorted_output.csv', index=False, encoding='utf-8')
关键说明:
dtype参数可以强制指定列的类型,确保数字列被识别为数值而不是字符串;sort_values方法直接按列的数值大小排序,无需手动转换类型,非常省心。
不管用哪种方法,核心思路都是让Python把这些内容当成数值而不是字符串来比较,这样就能得到符合预期的排序结果啦!
内容的提问来源于stack exchange,提问作者user5155721
相关产品推荐
相关产品推荐

