我有一个包含 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)
关于python - 如何在 python 中按两列对 csv 文件进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48004691/