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

标签 python

我有一个包含 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/

相关文章:

python - 在其他两个日期之间插入一个日期以获得一个值

python - 树莓派上的多个热电偶

python - 在opencv numpy中找到轮廓的边界点

python - numpy where 带有元组数组

python - 错误: 'NoneType' object is not iterable when read_sql

python - 如何在 Django 中的每个管理页面加载上运行 python 函数

python - 有没有办法将多个包与 Python setuptools 捆绑在一起?

python - 使用 numpy 将 bool 数组索引到多维数组中

python - 如何使用开放式简历在脑肿瘤上绘制矩形?

python - 如何定位图像中亮点的中心?