在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