📌  相关文章
📜  如何在Python按多列对 CSV 进行排序?(1)

📅  最后修改于: 2023-12-03 14:52:52.031000             🧑  作者: Mango

如何在Python按多列对 CSV 进行排序?

在Python中,我们可以使用csv模块来读取和操作CSV文件。当我们想要按多列排序CSV文件时,可以使用sorted函数和自定义比较函数来实现。

读取CSV文件

首先,我们需要使用csv模块中的reader函数读取CSV文件。

import csv

with open('data.csv', 'r') as csvfile:
    csvreader = csv.reader(csvfile)
    headers = next(csvreader) # 获取表头
    data = [row for row in csvreader] # 获取数据
按多列排序

接下来,我们可以使用sorted函数来按多列排序数据。比较函数需要返回一个数值,表示两个元素的大小关系。

def compare(row1, row2):
    # 按第1列升序排列
    if row1[0] < row2[0]:
        return -1
    elif row1[0] > row2[0]:
        return 1
    else:
        # 如果第1列相等,按第2列降序排列
        if row1[1] > row2[1]:
            return -1
        elif row1[1] < row2[1]:
            return 1
        else:
            return 0

sorted_data = sorted(data, key=lambda row: compare(row, headers))

在上面的比较函数中,我们先按第1列升序排列,如果第1列相等,再按第2列降序排列。

最后,我们可以使用csv模块中的writer函数将排序后的数据写入CSV文件。

with open('sorted_data.csv', 'w', newline='') as csvfile:
    csvwriter = csv.writer(csvfile)
    csvwriter.writerow(headers)
    csvwriter.writerows(sorted_data)

这样,我们就完成了按多列排序CSV文件的操作。

完整代码
import csv

def compare(row1, row2):
    # 按第1列升序排列
    if row1[0] < row2[0]:
        return -1
    elif row1[0] > row2[0]:
        return 1
    else:
        # 如果第1列相等,按第2列降序排列
        if row1[1] > row2[1]:
            return -1
        elif row1[1] < row2[1]:
            return 1
        else:
            return 0

with open('data.csv', 'r') as csvfile:
    csvreader = csv.reader(csvfile)
    headers = next(csvreader) # 获取表头
    data = [row for row in csvreader] # 获取数据

sorted_data = sorted(data, key=lambda row: compare(row, headers))

with open('sorted_data.csv', 'w', newline='') as csvfile:
    csvwriter = csv.writer(csvfile)
    csvwriter.writerow(headers)
    csvwriter.writerows(sorted_data)

注意:在写入CSV文件时,需要指定newline=''参数,否则可能会出现空行。