如何对文件中的特定信息进行排序
How to sort specific info in a file
我有一个预制的文本文件,里面有人名和乐谱。他们每个人都有三个分数,每个分数由制表符分隔。
John 12 13 21
Zack 14 19 12
Tim 18 22 8
Jill 13 3 22
现在,我的目标是按字母顺序对名称进行排序,只显示最高分。看起来像这样:
Jill 22
John 21
Tim 18
Zack 19
文件排序后,我想在 python shell 上打印它。我已经定义了代码,因为我将把它实现到我创建的其他代码中。
from operator import itemgetter
def highscore():
file1 = open("file.txt","r")
file1.readlines()
score1 = file1(key=itemgetter(1))
score2 = file1(key=itemgetter(2))
score3 = file1(key=itemgetter(3))
def class1alphabetical():
with open('file.txt') as file1in:
lines = [line.split('/t') for line in file1in]
lines.sort()
with open('file.txt', 'w') as file1out:
for el in lines:
file1out.write('{0}\n'.format(' '.join(el)))
with open('file.txt','r') as fileqsort:
for line in file1sort:
print(line[:-1])
file1sort.close
classfilealphabetical()
我使用了其他问题的信息,例如:Sorting information from a file in python and Python : Sort file by arbitrary column, where column contains time values
但是,我现在还在纠结怎么办。
哇哦,你做的好像有点太复杂了。
这是一个粗略的想法。
#this will get your folks in alpha
lines = f.readlines()
lines.sort()
#now, on each line, you want to split (that attrgetter is too complicated and
#blows up if <> 3 grades.
# use the special feature of split() with no parameter to remove all spaces and \t characters
fields = line.split()
name, grades = fields[0], fields[1:]
#cast your grades to integers
grades = [int(grade) for grade in grades]
#sort and pick the last one
grades.sort()
highest = grades[-1]
#or... use max as suggested
highest = max(grades)
#write to output file....
另一条建议,为您的文件使用带有上下文管理器的打开,它们可以嵌套。关闭资源是行为良好的 pgms 的主要组成部分。
with open("/temp/myinput.txt","r") as fi:
....
一旦你的行在排序列表中,试试这个:
output = ["{} {}".format(i[0], max(i[1:], key=int)) for i in lines]
for i in output:
print i
Jill 22
John 21
Tim 22
Zack 19
output
是使用 list comprehension.
创建的列表
大括号('{}
')被传递给 str.format()
的参数替换。 str
在这种情况下是 "{} {}"
max
函数采用关键字参数 'key',如上所示,它允许您指定一个函数以应用于给定 max
的可迭代对象中的每个项目(可迭代对象在这种情况下是 i[1:])。我使用 int
因为列表中的所有项目都是字符串(包含数字),并且必须转换为 int
s.
使用一些内置函数和交互很容易做到这一点:
代码:
#!/usr/bin/env python
from operator import itemgetter
scores = """\
John\t12\t13\t21\n
Zack\t14\t19\t12\n
Tim\t18\t22\t8\n
Jill\t13\t3\t22"""
datum = [x.split("\t") for x in filter(None, scores.split("\n"))]
for data in sorted(datum, key=itemgetter(0)):
name, scores = data[0], map(int, data[1:])
max_score = max(scores)
print "{0:s} {1:d}".format(name, max_score)
输出:
$ python -i scores.py
Jill 22
John 21
Tim 22
Zack 19
>>>
有两个明显的任务:
- 只保留最高分
- 按名称字母顺序对行进行排序
这是一个独立的脚本,它从每行中删除除最高分数之外的所有分数:
#!/usr/bin/env python3
import sys
import fileinput
try:
sys.argv.remove('--inplace') # don't modify file(s) unless asked
except ValueError:
inplace = False
else:
inplace = True # modify the files given on the command line
if len(sys.argv) < 2:
sys.exit('Usage: keep-top-score [--inplace] <file>')
for line in fileinput.input(inplace=inplace):
name, *scores = line.split() # split on whitespace (not only tab)
if scores:
# keep only the top score
top_score = max(scores, key=int)
print(name, top_score, sep='\t')
else:
print(line, end='') # print as is
示例:
$ python3 keep_top_score.py class6Afile.txt
要打印按名称排序的行:
$ sort -k1 class6Afile.txt
sort
命令的结果取决于您当前的语言环境,例如,您可以使用 LC_ALL=C
按字节值排序。
或者如果你想要Python解决方案:
#!/usr/bin/env python
import sys
from io import open
filename = sys.argv[1]
with open(filename) as file:
lines = file.readlines() # read lines
# sort by name
lines.sort(key=lambda line: line.partition('\t')[0])
with open(filename, 'w') as file:
file.writelines(lines) # write the sorted lines
此处的名称按 Unicode 文本排序。您可以提供文件中使用的显式字符编码,否则将使用默认(基于您的语言环境)编码。
示例:
$ python sort_inplace_by_name.py class6Afile.txt
结果
Jill 22
John 21
Tim 22
Zack 19
我有一个预制的文本文件,里面有人名和乐谱。他们每个人都有三个分数,每个分数由制表符分隔。
John 12 13 21
Zack 14 19 12
Tim 18 22 8
Jill 13 3 22
现在,我的目标是按字母顺序对名称进行排序,只显示最高分。看起来像这样:
Jill 22
John 21
Tim 18
Zack 19
文件排序后,我想在 python shell 上打印它。我已经定义了代码,因为我将把它实现到我创建的其他代码中。
from operator import itemgetter
def highscore():
file1 = open("file.txt","r")
file1.readlines()
score1 = file1(key=itemgetter(1))
score2 = file1(key=itemgetter(2))
score3 = file1(key=itemgetter(3))
def class1alphabetical():
with open('file.txt') as file1in:
lines = [line.split('/t') for line in file1in]
lines.sort()
with open('file.txt', 'w') as file1out:
for el in lines:
file1out.write('{0}\n'.format(' '.join(el)))
with open('file.txt','r') as fileqsort:
for line in file1sort:
print(line[:-1])
file1sort.close
classfilealphabetical()
我使用了其他问题的信息,例如:Sorting information from a file in python and Python : Sort file by arbitrary column, where column contains time values
但是,我现在还在纠结怎么办。
哇哦,你做的好像有点太复杂了。
这是一个粗略的想法。
#this will get your folks in alpha
lines = f.readlines()
lines.sort()
#now, on each line, you want to split (that attrgetter is too complicated and
#blows up if <> 3 grades.
# use the special feature of split() with no parameter to remove all spaces and \t characters
fields = line.split()
name, grades = fields[0], fields[1:]
#cast your grades to integers
grades = [int(grade) for grade in grades]
#sort and pick the last one
grades.sort()
highest = grades[-1]
#or... use max as suggested
highest = max(grades)
#write to output file....
另一条建议,为您的文件使用带有上下文管理器的打开,它们可以嵌套。关闭资源是行为良好的 pgms 的主要组成部分。
with open("/temp/myinput.txt","r") as fi:
....
一旦你的行在排序列表中,试试这个:
output = ["{} {}".format(i[0], max(i[1:], key=int)) for i in lines]
for i in output:
print i
Jill 22
John 21
Tim 22
Zack 19
output
是使用 list comprehension.
大括号('{}
')被传递给 str.format()
的参数替换。 str
在这种情况下是 "{} {}"
max
函数采用关键字参数 'key',如上所示,它允许您指定一个函数以应用于给定 max
的可迭代对象中的每个项目(可迭代对象在这种情况下是 i[1:])。我使用 int
因为列表中的所有项目都是字符串(包含数字),并且必须转换为 int
s.
使用一些内置函数和交互很容易做到这一点:
代码:
#!/usr/bin/env python
from operator import itemgetter
scores = """\
John\t12\t13\t21\n
Zack\t14\t19\t12\n
Tim\t18\t22\t8\n
Jill\t13\t3\t22"""
datum = [x.split("\t") for x in filter(None, scores.split("\n"))]
for data in sorted(datum, key=itemgetter(0)):
name, scores = data[0], map(int, data[1:])
max_score = max(scores)
print "{0:s} {1:d}".format(name, max_score)
输出:
$ python -i scores.py
Jill 22
John 21
Tim 22
Zack 19
>>>
有两个明显的任务:
- 只保留最高分
- 按名称字母顺序对行进行排序
这是一个独立的脚本,它从每行中删除除最高分数之外的所有分数:
#!/usr/bin/env python3
import sys
import fileinput
try:
sys.argv.remove('--inplace') # don't modify file(s) unless asked
except ValueError:
inplace = False
else:
inplace = True # modify the files given on the command line
if len(sys.argv) < 2:
sys.exit('Usage: keep-top-score [--inplace] <file>')
for line in fileinput.input(inplace=inplace):
name, *scores = line.split() # split on whitespace (not only tab)
if scores:
# keep only the top score
top_score = max(scores, key=int)
print(name, top_score, sep='\t')
else:
print(line, end='') # print as is
示例:
$ python3 keep_top_score.py class6Afile.txt
要打印按名称排序的行:
$ sort -k1 class6Afile.txt
sort
命令的结果取决于您当前的语言环境,例如,您可以使用 LC_ALL=C
按字节值排序。
或者如果你想要Python解决方案:
#!/usr/bin/env python
import sys
from io import open
filename = sys.argv[1]
with open(filename) as file:
lines = file.readlines() # read lines
# sort by name
lines.sort(key=lambda line: line.partition('\t')[0])
with open(filename, 'w') as file:
file.writelines(lines) # write the sorted lines
此处的名称按 Unicode 文本排序。您可以提供文件中使用的显式字符编码,否则将使用默认(基于您的语言环境)编码。
示例:
$ python sort_inplace_by_name.py class6Afile.txt
结果
Jill 22
John 21
Tim 22
Zack 19