Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中按两列对csv文件进行排序?_Python - Fatal编程技术网

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

如何在python中按两列对csv文件进行排序?,python,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=',') _ =

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

我做错了什么?

有了熊猫,你可以实现简单的目标

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')



lambda函数可以返回元组

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

 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])))

输出文件为空的原因是

sorted2 = sorted(reader, key=lambda row: int(row[2]))
正在尝试对
读取器
中的数据进行排序,但您已经读取了上一条排序语句中的所有数据,因此读取器已无法读取任何内容。但是,您确实不想从
读卡器
中对数据重新排序,而是想在
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)
该键函数首先按项目的
行[1]
值比较项目,如果这些值相同,则按项目的
行[2]
值比较项目。这可能不会给出您真正想要的订单。您可能希望颠倒这些测试的顺序:

key=lambda row: (int(row[2]), int(row[1])) 
正如Peter Wood在评论中提到的,Writer对象有一个方法,可以在一次调用中写入所有行。这比在
for
循环中逐个写入行更有效

顺便说一句,没有必要做这个任务:

_ = next(reader)
next(reader)
我想这表明您正在丢弃第1行,但您可以只编写调用而不执行赋值:

_ = next(reader)
next(reader)

一点:“如果csvfile是一个文件对象,那么在有区别的平台上,它必须使用“b”标志打开。”@sancho.s对于Python 2来说确实如此,但在Python 3中,CSV文件必须以文本模式打开。当您想使用同时在Python 2和Python 3上运行的代码来处理CSV文件时,这相当烦人。@PM2Ring-True。OP没有指定版本,然后是警告。您是否检查了sorted1和sorted2的内容以确定问题出在哪里?这很好,但OP没有提到熊猫,那么您为什么要发布熊猫的答案?并不是每个人都安装了Pandas,标准的
csv
模块完全能够执行这样的简单任务。此外,它将为您循环并写入所有行。@Lala无需担心。顺便说一句,我在回答中添加了更多信息。