【问题标题】:Sort CSV by column name按列名对 CSV 排序
【发布时间】:2018-06-01 21:15:56
【问题描述】:

我需要按列名对 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

漂亮的印刷品:

  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

通常我可以按row[5] 排序,但如果我得到一张没有任何绿色的表格,或者一张带有额外列的表格 - 黄色,它将不再工作。

因此问题是,如何按名为 Total 的列对这个 CSV 文件进行排序?

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

【问题讨论】:

  • Can only use python modules, no pandas. :(?为什么?这是作业吗?
  • 熊猫是python模块
  • 你在某处有列名,对吧?查找名为Total 的索引并按该索引排序。
  • 你想要什么输出?打印或写入文件?
  • 那么就sort(key lambda row: row[-1])

标签: python python-3.x csv sorting


【解决方案1】:

如果您需要使用列名进行排序,最好使用 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)

这将允许您根据Total 列进行排序,而不管它在哪里。 csv.DictReader() 读取每一行作为字典,使用第一行作为标题。然后可以将标头值用作字典键来访问项目,而不是使用具有普通csv.reader() 的位置值。所以你的第一个数据行将被读作:

{'Total': '1', 'Blue': '0', 'Black': '1', 'Green': '0', 'X': 'Andy', 'Red': '0'}

csv_input 然后可以直接传递给sorted() 以创建行字典的排序列表。 keytotal 字段,然后在总数相同的情况下也是 X 字段。

这将编写一个排序后的output.csv,如下所示:

X,Blue,Black,Red,Green,Total
Andy,0,1,0,0,1
Mark,1,0,0,1,2
Ronda,0,1,0,1,2
Thomas,2,0,0,0,2
Luise,0,0,2,1,3

【讨论】:

    【解决方案2】:

    类似的,

    reader = csv.reader(open('input.csv'))
    
    header = reader.next()
    sort_col_idx = header.index('Total')
    sorted(reader, key=lambda row: row[sort_col_idx]) # Without header
    [header] + sorted(reader, key=lambda row: row[sort_col_idx]) # With headers.
    

    【讨论】:

      【解决方案3】:

      您可以定义一个函数来根据任何列进行排序。

      import csv
      import operator
      
      data = csv.reader(open('input.csv'))
      
      # function to sort according to any column.
      # table corresponds to data and col is argument for the row number. here 5
      def sort_table(table, col=0):
           return sorted(table, key=operator.itemgetter(col))
      
      print(sort_table(data, 5))
      

      但是熊猫是更好的选择。试着习惯它。

      【讨论】:

      • 恐怕不行,因为列数是动态的,所以Total 不会总是有那个索引。
      猜你喜欢
      • 2011-01-07
      • 2019-08-23
      • 1970-01-01
      • 2015-12-24
      • 2014-07-06
      • 1970-01-01
      • 2018-05-05
      • 2021-09-04
      相关资源
      最近更新 更多