在python中使用csv工具对txt文件排序的最佳方法

在python中使用csv工具对txt文件排序的最佳方法,python,file,csv,sorting,Python,File,Csv,Sorting,我有以下代码,并试图用最简单的方法对文件内容进行排序 import csv import operator #==========Search by ID number. Return Just the Name Fields for the Student with open("studentinfo.txt","r") as f: studentfileReader=csv.reader(f) id=input("Enter Id:") for row in studentfi

我有以下代码,并试图用最简单的方法对文件内容进行排序

import csv
import operator

#==========Search by ID number. Return Just the Name Fields for the Student
with open("studentinfo.txt","r") as f:
  studentfileReader=csv.reader(f)
  id=input("Enter Id:")
  for row in studentfileReader:
    for field in row:
      if field==id:
        currentindex=row.index(id)
        print(row[currentindex+1]+" "+row[currentindex+2])

#=========Sort by Last Name
with open("studentinfo.txt","r") as f:
  studentfileReader=csv.reader(f)
  sortedlist=sorted(f,key=operator.itemgetter(0),reverse=True)
  print(sortedlist)
我知道各种可能的解决方案,但无法让它们正确运行,而且出于教学/学习目的,我也会对最简单有效的解决方案感兴趣,并给出明确的解释。

研究包括: ****进口经营者**** sortedlist=sorted(读卡器,键=operator.itemgetter(3),反向=True)

或使用lambda sortedlist=已排序(读卡器,键=lambda行:行[3],反向=真)

对于答案,如果有人能发布一个完整的工作解决方案,显示按姓氏和ID号排序,以说明两个不同的例子,我将不胜感激。答案的一个扩展是在这个特定示例中显示如何按多个值排序:

完整代码列表:

文件内容

002,Ash,Smith,Test1:20,Test2:20,Test3:100003
004,Grace,Asha,Test1:33,Test2:54,Test3:23
005,Cat,Zelch,Test1:66,Test2:22,Test3:11
001,Joe,Bloggs,Test1:99,Test2:100,Test3:1
003,Jonathan,Peter,Test1:99,Test2:33,Test3:44

正如您所做的那样,使用导入运算符和一个可能的解决方案:注意——理想情况下,您需要一个标题来区分您要排序的内容(假设用户希望明确指定此项)


正如您所做的那样,使用导入运算符和一个可能的解决方案:注意——理想情况下,您需要一个标题来区分您要排序的内容(假设用户希望明确指定此项)


您可以使用
lambda
函数按
csv
读取器返回的列表的任何键进行排序,例如按姓氏(第三列):

或按ID(第一列):

或者按两个键:

with open("studentinfo.txt", "r") as f:
    reader = csv.reader(f)
    sorted_list = list(reader)  # turn the reader iterator into a list
    sorted_list.sort(key=lambda x: (x[3], x[4]))  # use fourth and fifth column
    print("\n".join(str(row) for row in sorted_list))  # prettier print
您可以将
reverse=True
添加到
列表中。sort()调用降序排序

ADDENUM-如果你真的不想使用lambdas(为什么?),你可以定义一个item getter函数(或者只使用为此目的而存在的
操作符.itemgatter
),并将其传递给
列表.sort()
调用,例如:

def get_third_column(x):
    return x[2]

with open("studentinfo.txt", "r") as f:
    reader = csv.reader(f)
    sorted_list = list(reader)  # turn the reader iterator into a list
    sorted_list.sort(key=get_third_column)  # use the third column as a sorting key
    print("\n".join(str(row) for row in sorted_list))  # prettier print

您可以使用
lambda
函数按
csv
读取器返回的列表的任何键进行排序,例如按姓氏(第三列):

或按ID(第一列):

或者按两个键:

with open("studentinfo.txt", "r") as f:
    reader = csv.reader(f)
    sorted_list = list(reader)  # turn the reader iterator into a list
    sorted_list.sort(key=lambda x: (x[3], x[4]))  # use fourth and fifth column
    print("\n".join(str(row) for row in sorted_list))  # prettier print
您可以将
reverse=True
添加到
列表中。sort()调用降序排序

ADDENUM-如果你真的不想使用lambdas(为什么?),你可以定义一个item getter函数(或者只使用为此目的而存在的
操作符.itemgatter
),并将其传递给
列表.sort()
调用,例如:

def get_third_column(x):
    return x[2]

with open("studentinfo.txt", "r") as f:
    reader = csv.reader(f)
    sorted_list = list(reader)  # turn the reader iterator into a list
    sorted_list.sort(key=get_third_column)  # use the third column as a sorting key
    print("\n".join(str(row) for row in sorted_list))  # prettier print

一种紧凑、简单的读取->排序->写入解决方案:

import csv
import operator

with open("input.csv") as fh:
    reader = csv.reader(fh)
    rows = sorted(reader, key=operator.itemgetter(0), reverse=True)

with open("output.csv", "w") as fh:
    csv.writer(fh).writerows(rows)
要在控制台上打印而不是写入文件, 您可以使用
sys.stdout
作为文件句柄:

import sys

with sys.stdout as fh:
    csv.writer(fh).writerows(rows)
操作符.itemgetter(0)
确定按哪个字段排序。 第0个字段是id。 要按姓氏排序,请使用
操作符.itemgetter(2)
, 因为姓是第三列

要按多个字段排序,需要使用lambda,例如按姓氏和姓氏排序:

    rows = sorted(reader, key=lambda x: (x[2], x[1]), reverse=True)

排序前的代码,其中要求用户输入Id, 还可以改进:

  • 当您知道id字段是第一个字段时,就不需要对每个字段进行迭代
  • id
    隐藏Python中的内置函数,因此不建议将其用作变量
你可以这样写:

with open("studentinfo.txt") as fh:
    reader = csv.reader(fh)
    student_id = input("Enter Id:")
    for row in reader:
        if row[0] == student_id:
            print(row[1] + " " + row[2])

一种紧凑、简单的读取->排序->写入解决方案:

import csv
import operator

with open("input.csv") as fh:
    reader = csv.reader(fh)
    rows = sorted(reader, key=operator.itemgetter(0), reverse=True)

with open("output.csv", "w") as fh:
    csv.writer(fh).writerows(rows)
要在控制台上打印而不是写入文件, 您可以使用
sys.stdout
作为文件句柄:

import sys

with sys.stdout as fh:
    csv.writer(fh).writerows(rows)
操作符.itemgetter(0)
确定按哪个字段排序。 第0个字段是id。 要按姓氏排序,请使用
操作符.itemgetter(2)
, 因为姓是第三列

要按多个字段排序,需要使用lambda,例如按姓氏和姓氏排序:

    rows = sorted(reader, key=lambda x: (x[2], x[1]), reverse=True)

排序前的代码,其中要求用户输入Id, 还可以改进:

  • 当您知道id字段是第一个字段时,就不需要对每个字段进行迭代
  • id
    隐藏Python中的内置函数,因此不建议将其用作变量
你可以这样写:

with open("studentinfo.txt") as fh:
    reader = csv.reader(fh)
    student_id = input("Enter Id:")
    for row in reader:
        if row[0] == student_id:
            print(row[1] + " " + row[2])

这很有用——在添加标题方面,这是我需要研究的。你能用我现有的和原始的代码发布一个完整的解决方案吗?这很有用-在添加标题方面,这是我需要研究的。你能用我现有的原始代码发布完整的解决方案吗?你能在没有lambda的情况下提出建议吗(对于初学者来说,有没有一种方法可以做到这一点而不引入任何外部内容)。@misscuting-
lambda
函数不是外部的,它们是Python语言的重要组成部分。如果愿意,可以将它们替换为已定义的函数。我将在上面添加一个例子。谢谢你-我从中吸取了教训。尽管如此,函数还是增加了不必要的复杂性。想一想:完全初学者(儿童!)的教学法你能建议一些没有lambda的东西吗(对于初学者,有没有一种方法可以做到这一点而不引入任何外部的东西)。@misscuting-
lambda
函数不是外部的,它们是Python语言的重要组成部分。如果愿意,可以将它们替换为已定义的函数。我将在上面添加一个例子。谢谢你-我从中吸取了教训。尽管如此,函数还是增加了不必要的复杂性。想想:完全初学者(儿童)的教学法!我喜欢第一个函数的外观,因为我不需要多值排序,这就是为什么最简单的解决方案就是我想要的。但是,您是否可以使用我的原始代码作为工作日志发布解决方案answer@MissComputing你的意思是要包括代码的第一部分,在那里你需要一个Id并打印一个名字?或者你所说的“作为工作答案的原始代码”是什么意思?我加了一个bi