我有一个包含6列的csv文件。
我想按第2列然后按第3列对其进行排序。
我当前的代码正在创建一个空白文件:
import csv
with open('original.csv', mode='rt') as f, open('sorted.csv', 'w') as final:
writer = csv.writer(final, delimiter='\t')
reader = csv.reader(f, delimiter=',')
_ = next(reader)
sorted1 = sorted(reader, key=lambda row: int(row[1]))
sorted2 = sorted(reader, key=lambda row: int(row[2]))
for row in sorted2:
writer.writerow(row)
我究竟做错了什么?
您的输出文件为空的原因是
sorted2 = sorted(reader, key=lambda row: int(row[2]))
正在尝试从中对数据进行排序reader
,但是您已经读取了前一个排序语句中的所有数据,因此读者没有任何剩余要读取的内容。但是,你真的不希望重新排序从数据reader
,你要重新排序的数据sorted1
,如下所示:
import csv
with open('original.csv', mode='rt') as f, open('sorted.csv', 'w') as final:
writer = csv.writer(final, delimiter='\t')
reader = csv.reader(f, delimiter=',')
_ = next(reader)
sorted1 = sorted(reader, key=lambda row: int(row[1]))
sorted2 = sorted(sorted1, key=lambda row: int(row[2]))
for row in sorted2:
writer.writerow(row)
OTOH,无需分两次进行排序。您可以通过更改键功能一次完成此操作。
import csv
with open('original.csv', mode='rt') as f, open('sorted.csv', 'w') as final:
writer = csv.writer(final, delimiter='\t')
reader = csv.reader(f, delimiter=',')
_ = next(reader)
sorted2 = sorted(reader, key=lambda row: (int(row[1]), int(row[2])))
for row in sorted2:
writer.writerow(row)
该键功能首先按项目的row[1]
值比较它们,如果这些值相同,则按其row[2]
值比较它们。那可能无法给出您真正想要的顺序。您可能需要颠倒这些测试的顺序:
key=lambda row: (int(row[2]), int(row[1]))
正如Peter Wood在评论中提到的那样,Writer对象具有一种writerows
将在一次调用中写入所有行的方法。这比在for
循环中逐行写入行更有效。
顺便说一句,无需执行此任务:
_ = next(reader)
我想这很清楚地表明您正在丢弃第一行,但是您可以在不执行分配的情况下编写调用:
next(reader)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句