按列名对CSV排序

Tha*_*guy 5 python csv sorting python-3.x

我需要按列名对CSV表进行排序。我从CSV中获得的数据具有各种列数,但是列名是静态的。这是我的数据:

X,Blue,Black,Red,Green,Total
Thomas,2,0,0,0,2
Andy,0,1,0,0,1
Luise,0,0,2,1,3
Mark,1,0,0,1,2
Ronda,0,1,0,1,2
Run Code Online (Sandbox Code Playgroud)

漂亮的印刷品:

  X     Blue    Black   Red Green  Total
Thomas   2       0       0    0     2
Andy     0       1       0    0     1
Luise    0       0       2    1     3
Mark     1       0       0    1     2
Ronda    0       1       0    1     2
Run Code Online (Sandbox Code Playgroud)

通常,我可以按排序,row[5]但是如果我得到的表没有绿色,或者表中有其他列-黄色,它将不再起作用。

因此,问题是,如何按名为的列对该CSV文件排序Total

只能使用核心python模块,不能使用熊猫。:(

Mar*_*ans 5

如果需要使用列名进行排序,则最好使用Python csv.DictReader()对象读取文件,如下所示:

import csv

with open('input.csv', 'r', newline='') as f_input:
    csv_input = csv.DictReader(f_input)
    data = sorted(csv_input, key=lambda row: (row['Total'], row['X']))

with open('output.csv', 'w', newline='') as f_output:    
    csv_output = csv.DictWriter(f_output, fieldnames=csv_input.fieldnames)
    csv_output.writeheader()
    csv_output.writerows(data)
Run Code Online (Sandbox Code Playgroud)

这样,Total无论您在何处,都可以根据该列进行排序。在csv.DictReader()读取每一行视为一个字典,使用第一行作为一个报头。然后可以将标头值用作字典项以访问项目,而不是使用带有normal的位置值csv.reader()。因此,您的第一个数据行将被读取为:

{'Total': '1', 'Blue': '0', 'Black': '1', 'Green': '0', 'X': 'Andy', 'Red': '0'}
Run Code Online (Sandbox Code Playgroud)

csv_input然后可以直接传递给它sorted()以创建行字典的排序列表。该keytotal字段,然后还X对其中总相同的情况下现场。

然后将编写output.csv如下的排序:

import csv

with open('input.csv', 'r', newline='') as f_input:
    csv_input = csv.DictReader(f_input)
    data = sorted(csv_input, key=lambda row: (row['Total'], row['X']))

with open('output.csv', 'w', newline='') as f_output:    
    csv_output = csv.DictWriter(f_output, fieldnames=csv_input.fieldnames)
    csv_output.writeheader()
    csv_output.writerows(data)
Run Code Online (Sandbox Code Playgroud)