不使用pandas处理CSV:修复索引排序异常及表头缺失问题
代码存在的问题
- 排序逻辑错误:你直接把索引列(
row[0])作为排序键,CSV读取出来的所有值默认都是字符串类型,字符串排序是逐位比较ASCII码,"10"的首字符"1"比"2"的首字符"2"小,所以会出现10排在2前面的问题。 - 未写入表头:你读取数据后只取了
lines[1:](即跳过表头的所有数据行)做排序,写回文件时也只写入了排序后的数据行,没有把表头加回去。你代码中定义的csv.DictWriter被后续的csv.writer覆盖,完全没有生效。 - (可选优化):直接用
open()打开文件没有用上下文管理器,存在异常时文件未正常关闭的风险。
修改方案
如果你需要按索引数值升序排序(最终顺序为1、2、3...9、10,符合常规数值排序逻辑),修改后代码如下:
import csv def sort_index(): # 用with上下文管理器自动处理文件关闭 with open("transactions1.csv","r", newline='') as read_file: r = csv.reader(read_file) lines = list(r) header = lines[0] # 排序时把索引列转成整数做比较,实现数值升序 sorted_lines = sorted(lines[1:], key=lambda row: int(row[0])) with open('transactions1.csv','w',newline='') as file_writer: writer = csv.writer(file_writer) # 先写入表头 writer.writerow(header) # 再写入排序后的数据 writer.writerows(sorted_lines) return False sort_index()
如果你确实需要按索引字符串排序(1、10、2、3...的顺序和你给出的预期输出一致),只需要把排序的key改回lambda row: row[0]即可,其他逻辑保持不变。
内容的提问来源于stack exchange,提问作者Sophie
相关产品推荐
相关产品推荐

