CSV排序代码作业平台运行异常,请求排查失效原因
CSV排序代码本地正常但作业环境异常的原因排查
问题背景
我要实现对CSV文件排序并保存到新文件的功能。自己写的代码在本地打开生成的新文件看起来正常,但在作业界面运行时输出异常。已经有正确实现的代码,但搞不懂自己的代码为啥失效,需要排查原因。
原始CSV内容
city/month,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec Melbourne,41.2,35.5,37.4,29.3,23.9,16.8,18.2,25.7,22.3,33.5,36.9,41.1 Brisbane,31.3,40.2,37.9,29,30,26.7,26.7,28.8,31.2,34.1,31.1,31.2 Darwin,34,34,33.2,34.5,34.8,33.9,32,34.3,36.1,35.4,37,35.5 Perth,41.9,41.5,42.4,36,26.9,24.5,23.8,24.3,27.6,30.7,39.8,44.2 Adelaide,42.1,38.1,39.7,33.5,26.3,16.5,21.4,30.4,30.2,34.9,37.1,42.2 Canberra,35.8,29.6,35.1,26.5,22.4,15.3,15.7,21.9,22.1,30.8,33.4,35 Hobart,35.5,34.1,30.7,26,20.9,15.1,17.5,21.7,20.9,24.2,30.1,33.4 Sydney,30.6,29,35.1,27.1,28.6,20.7,23.4,27.7,28.6,34.8,26.4,30.2
我的失效代码(Below1)
import csv def sort_records(csv_filename, new_filename): file = open(csv_filename) lines = file.readlines() newfile = open(new_filename, "w") header = lines[0] newfile.write(header) lines.remove(header) lines.sort(key=lambda x: x[0]) for item in lines: newfile.write(item) file.close() newfile.close()
作业界面的异常输出(Below2)
city/month,Jan,Feb,Mar,Apr Brisbane,31.3,40.2,37.9,29 Darwin,34,34,33.2,34.5Melbourne,41.2,35.5,37.4,29.3
正确实现代码(Below3)
import csv def sort_records(csv_filename, new_filename): csv_file = open(csv_filename) reader = csv.reader(csv_file) header = next(reader) data2d = list(reader) data2d.sort() csv_file.close() new_file = open(new_filename, "w") writer = csv.writer(new_file) writer.writerow(header) writer.writerows(data2d) new_file.close()
失效原因分析
你的代码失效主要有两个核心问题:
排序逻辑错误,依赖行首字符而非CSV字段
你用lambda x: x[0]作为排序键,也就是取每行的第一个字符来排序。这种逻辑非常脆弱:- 如果某行的第一个字段前有空格,排序会直接以空格为键,导致顺序混乱;
- 如果存在多个首字符相同的城市(比如Brisbane和Ballarat),会按整行字符串排序,而非按城市名字段排序,结果不符合预期;
- 若CSV字段包含引号(比如带逗号的字段
"New York, NY"),行首字符会是引号,完全打乱排序逻辑。
而正确代码用csv.reader把每行拆成字段列表,data2d.sort()默认按第一个字段(城市名)排序,这才是符合需求的逻辑。
直接操作纯文本行,未处理CSV格式的特殊性
你直接用readlines()读取所有行并写入,没有使用CSV库处理格式:- 不同操作系统的换行符不一致(Windows是
\r\n,Linux是\n),readlines()会自动转换换行符,但写入时可能出现转换异常,导致某些行缺失换行符,出现像异常输出里的行粘在一起的情况; - 合法CSV允许字段包含换行符(用引号包裹),这种情况下
readlines()会把一个CSV记录拆成多行,导致排序和写入完全错误; - 未使用上下文管理器(
with语句)打开文件,可能出现文件未正确关闭,导致内容写入不完整的问题。
- 不同操作系统的换行符不一致(Windows是
csv库的reader和writer会自动处理这些CSV格式细节,包括换行符、字段分隔、特殊字符转义等,所以能在不同环境下稳定运行。
内容的提问来源于stack exchange,提问作者aadyali
相关产品推荐
相关产品推荐

