【问题标题】:how to sort data in csv file using python using particular column如何使用python使用特定列对csv文件中的数据进行排序
【发布时间】:2019-05-02 06:26:31
【问题描述】:

我正在从 csv 文件中读取数据并尝试使用特定列对数据进行排序,例如从 csv 文件中向 100 名学生读取数据,并且必须根据标记对数据进行排序

import csv
import operator

with open('Student_Records.csv', 'r') as csvFile:
    reader = csv.reader(csvFile)
    for row in reader:
        print(row)
sortedlist = sorted(reader, key=operator.itemgetter(7), reverse=True)

for eachline in sortedlist:
    print(eachline)

csvFile.close()

excel表格中的csv文件,该文件没有列名,下面是csv文件数据

1,Lois,Walker,F,lois.walker@hotmail.com,Donald Walker,Helen Walker,40,303-572-8492
2,Brenda,Robinson,F,brenda.robinson@gmail.com,Raymond Robinson,Judy Robinson,80,225-945-4954
3,Joe,Robinson,M,joe.robinson@gmail.com,Scott Robinson,Stephanie Robinson,70,219-904-2161
4,Diane,Evans,F,diane.evans@yahoo.com,Jason Evans,Michelle Evans,90,215-793-6791
5,Benjamin,Russell,M,benjamin.russell@charter.net,Gregory Russell,Elizabeth Russell,56,262-404-2252
6,Patrick,Bailey,M,patrick.bailey@aol.com,Ralph Bailey,Laura Bailey,36,319-812-6957
7,Nancy,Baker,F,nancy.baker@bp.com,Scott Baker,Judy Baker,78,229-336-5117

【问题讨论】:

  • 我想你已经做到了:key=operator.itemgetter(7),你需要改变你的密钥。发布您的 csv 的一部分以获得进一步的帮助?
  • 用这个编辑你的问题。
  • 您可能想要编辑您的问题并将 csv 的格式化部分添加到您的问题中
  • @GeethaTabjul 输入是 csv 还是 tsv?没有逗号。
  • 那么逗号在哪里?使用的分隔符是什么?

标签: python csv


【解决方案1】:

你可以试试

import csv
with open('input.csv', newline='') as csvfile:
    rdr = csv.reader(csvfile)
    l = sorted(rdr, key=lambda x: x[6], reverse=True)

csv.reader()用于创建一个reader对象,使用sorted()reverse=True进行降序排序得到一个列表。

此列表可用于使用类似的方式写出输出 csv

with open('output.csv', 'w') as csvout:
    wrtr = csv.writer(csvout)
    wrtr.writerows(l)

输出的 csv 文件类似于

4,Diane   Evans,F,diane.evans@yahoo.com,Jason Evans,Michelle Evans,90,215-793-6791
2,Brenda  Robinson,F,brenda.robinson@gmail.com,Raymond Robinson,Judy Robinson,80,225-945-4954
3,Joe Robinson,M,joe.robinson@gmail.com,Scott Robinson,Stephanie Robinson,70,219-904-2161
5,Benjamin    Russell,M,benjamin.russell@charter.net,Gregory Russell,Elizabeth Russell,56,262-404-2252
1,Lois  Walker,F,lois.walker@hotmail.com,Donald Walker,Helen Walker,40,303-572-8492

由于您是从文件对象中读取数据,请将newline 参数指定为'' 以确保安全。

正如文档所说:

如果 csvfile 是一个文件对象,它应该用 newline='' 打开。

来自docs

如果未指定 newline='',则嵌入在引用字段中的换行符将不会被正确解释,并且在使用 \r\n linendings on write 的平台上将添加额外的 \r。指定 newline='' 应该始终是安全的,因为 csv 模块自己(通用)换行处理。

【讨论】:

    【解决方案2】:

    下面应该对你有用,我在读取 csv 后创建了一个行列表,这样标记实际上是整数,而不是从 csv 读取的字符串

    另外我假设 csv 中有多个空格,所以我使用了一个空格分隔符,所以 itemgetter 索引被选择为 9,这可能会根据你的 csv 的样子而有所不同

    import csv
    import operator
    
    li = []
    
    #Open csv file
    with open('file.csv', 'r') as csvFile:
        reader = csv.reader(csvFile, delimiter=' ', skipinitialspace=True )
    
        #Create a list of all rows such that the marks column is an integer
        for item in reader:
            #Save marks value as an integer, leave other values as is
            l = [int(value) if idx == 9 else value for idx, value in enumerate(item)]
            li.append(l)
    
    #Sort on that item
    print(sorted(li, key=operator.itemgetter(9), reverse=True))
    

    我的 csv 看起来像:

    1   Lois    Walker  F   lois.walker@hotmail.com Donald Walker   Helen Walker    40  303-572-8492
    2   Brenda  Robinson    F   brenda.robinson@gmail.com   Raymond Robinson    Judy Robinson   80  225-945-4954
    3   Joe Robinson    M   joe.robinson@gmail.com  Scott Robinson  Stephanie Robinson  70  219-904-2161
    4   Diane   Evans   F   diane.evans@yahoo.com   Jason Evans Michelle Evans  90  215-793-6791
    5   Benjamin    Russell M   benjamin.russell@charter.net    Gregory Russell Elizabeth Russell   56  262-404-2252
    

    输出看起来像

    [['4', 'Diane', 'Evans', 'F', 'diane.evans@yahoo.com', 'Jason', 'Evans', 'Michelle', 'Evans', 90, '215-793-6791'], 
    ['2', 'Brenda', 'Robinson', 'F', 'brenda.robinson@gmail.com', 'Raymond', 'Robinson', 'Judy', 'Robinson', 80, '225-945-4954'], 
    ['3', 'Joe', 'Robinson', 'M', 'joe.robinson@gmail.com', 'Scott', 'Robinson', 'Stephanie', 'Robinson', 70, '219-904-2161'], 
    ['5', 'Benjamin', 'Russell', 'M', 'benjamin.russell@charter.net', 'Gregory', 'Russell', 'Elizabeth', 'Russell', 56, '262-404-2252'], 
    ['1', 'Lois', 'Walker', 'F', 'lois.walker@hotmail.com', 'Donald', 'Walker', 'Helen', 'Walker', 40, '303-572-8492']]
    

    【讨论】:

      【解决方案3】:

      试试熊猫,

      df = pd.read_csv("your_file", sep='xx', 
                    names = ["x", "y", "z", "marks"])
      
      df.sort_values('marks')
      
      print(df)
      

      【讨论】:

        猜你喜欢
        • 2011-12-23
        • 2019-04-06
        • 2014-09-04
        • 1970-01-01
        • 2012-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        相关资源
        最近更新 更多