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



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

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(reader, key=operator.itemgetter(3(, reverse=True(

或使用 lambda排序列表 = 排序(读取器,键=lambda 行:行[3],反向=真(

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

完整代码列表:

https://repl.it/Jau3/3

文件内容

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例如,按姓氏(第三列(:

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[2])  # use the third column as a sorting key
print("n".join(str(row) for row in sorted_list))  # prettier print

或按 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[0])  # the first column as a sorting key, can be omitted
print("n".join(str(row) for row in sorted_list))  # prettier print

或者通过两个键:

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添加到降序排序的list.sort()调用中。

ADDENUM- 如果你真的不想使用 lambdas(为什么?(,你可以定义一个 item-getter 函数(或者只是使用为此目的而存在的operator.itemgetter(并将其传递给list.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)

operator.itemgetter(0)确定要作为排序依据的字段。 第 0 个字段是 id。 要按姓氏排序,请使用operator.itemgetter(2), 因为姓氏是第 3 列。

要按多个字段排序,您需要使用 lambda,例如按姓氏排序,然后按名字排序:

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

排序前的代码,您要求用户输入 Id, 也可以改进:

  • 当您知道 id 字段是第一个字段时,无需遍历每个字段
  • idPython 中的内置函数隐藏,因此不建议用作变量

你可以这样写:

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
ifile =open('myfile.csv', 'rb')
infile = csv.reader(ifile)
# Note that if you have a header, this is the header line
infields = infile.next()
startindex = infields.index('Desired Header')
# Here you are creating the sorted list
sortedlist = sorted(infile, key=operator.itemgetter(startindex), reverse=True)
ifile.close
# open the output file - it can be the same as the input file
ofile = open('myoutput.csv, 'wb')
outfile.writerow(infields)
for row in sortedlist:
outfile.writerow(row)
ofile.close()