如何在python中按两列对csv文件进行排序?

时间:2017-12-28 09:13:49

标签: python

我有一个包含6列的csv文件。

我希望按col#2排序,然后按col#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)

我做错了什么?

4 个答案:

答案 0 :(得分:5)

输出文件为空的原因是

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)

答案 1 :(得分:0)

使用pandas可以实现简单。

import pandas as pd

df = pd.read_csv('original.csv', delimiter='\t')

df = df.sort_values(['col1', 'col2'], ascending=[True, True]) # parameter ascending is applied to 'col1' and 'col2' respectively.

df.to_csv('sorted.csv')

doc to pandas read_csv

doc to pandas sort

答案 2 :(得分:0)

lambda函数可以返回一个元组

sorted(reader, key=lambda row: (int(row[1]), int(row[2])))

答案 3 :(得分:0)

试试这个

 with open('original.csv',mode='r') as csvfile:
        reader = csv.DictReader(csvfile, delimiter=";")
        sortedlist = sorted(reader, key=lambda row:(int(row[1]), int(row[2])))