1、 已知“score”文件夹下 score.txt 中保存有 10 个评委对 3 个候选人的打分情况,示例如 下 Judge1,75,85,81 Judge2,84,87,76 ……
从左到右各个字段的含义分别为:评委号,1 号候选人得分,2 号候选人得分,3 号候选 人得分,各字段之间用逗号分隔。 要求设计 Python 程序,(1)读取该 txt 文件,将每个候选人的得分去掉一个最高分和一 个最低分,(2)计算剩余得分的平均数作为该候选人最终成绩,(3)找出最终成绩最高 的候选人的编号及最终成绩,分别输出到 socre 文件夹下 score.xlsx 文件的 score 工作簿 中A1 和 B1 单元格,如下图所示。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import openpyxl
from openpyxl import Workbook
# 创建三个空列表来存储每个候选人的分数s
player1 = []
player2 = []
player3 = []
play = [player1, player2, player3]
j = 1
# 创建一个字典存储每个人的最终得分
result = {}
with open("score.txt", 'r') as fp:
# 先打开文本将所有的分数存入每个人的列表
for i in range(10):
scores = fp.readline().strip().split(',')
player1.append(int(scores[1]))
player2.append(int(scores[2]))
player3.append(int(scores[3]))
# 去掉每个人的最高分并计算平均分
for i in play:
maxScore = max(i)
i.remove(maxScore)
minScore = min(i)
i.remove(minScore)
averageScore = sum(i)/len(i)
# 将每个候选人的序号及其对应分数放入字典
player = 'player' +str(j)
j += 1
result[player] = averageScore
# 获取得分最高的候选人及其分数
winner = max(result, key=result.get)
winnerScore = result[max(result, key=result.get)]
# 将成绩最高的候选人的编号及其最终成绩输出到score文件夹
fn = 'score.xlsx'
wb = Workbook()
ws = wb.create_sheet(title='score')
ws['A1'] = winner
ws['B1'] = winnerScore
wb.save(fn)
2、 sensor 文件夹下存在两个 Python 源文件,分别对应两个问题。请按照文件内说明修改 代码,实现以下功能: 下面所示为一套由公司职员随身佩戴的位置传感器采集的数据,文件名称为 “sensor.txt”,其内容示例如下 2016/5/31 0:05, vawelon001,1,1 2016/5/31 0:20, arpa001,1,1 2016/5/31 2:26, arpa001,1,6 … (略) 第一列是传感器获取数据的时间,第二列是传感器的编号,第三列是传感器所在的楼层, 第四列是传感器所在的位置区域编号,各字段之间用逗号分隔。
问题 1:在 PY301_1.py 文件中修改代码,读入 sensor.txt 文件中的数据,提取出传感器 编号为 arpa001 的所有数据,将结果输出保存到“arpa001.txt”文件。 输出文件格式要求:原数据文件中的每行记录写入新文件中,行尾无空格,无空行。参考 格式如下:
2016/5/31 7:11, arpa001,2,4 2016/5/31 8:02, arpa001,3,4 2016/5/31 9:22, arpa001,3,4 …(略)
# 以下代码为提示框架
# 请在...处使用一行或多行代码替换
# 请在______处使用一行代码替换
# 打开sensor.txt来读取数据
# 创建earpa001.txt来写入数据
with open('sensor.txt', encoding="utf-8")as fn:
with open('earpa001.txt', 'w')as fo:
for line in fn:
# 一行的内容写入一个列表,每个元素对应每一列的内容
lst = line.strip(" \n").split(",")
# 验证第二个元素是不是earpa001,若是,则将该行写入文本
if lst[1] == " earpa001":
fo.write('{},{},{},{}\n'.format(lst[0], lst[1], lst[2], lst[3]))
(选做)问题 2:在 PY301_2.py 文件中修改代码,读入“arpa001.txt”文件中的数据, 统计 arpa001 对应的职员在各楼层和区域出现的次数,保存到“earpa001_count.txt” 文件,每条记录一行,位置信息和出现的次数之间用英文半角逗号隔开,行尾无空格,无 空行。
参考格式如下 1-1,5 1-4,3 …(略) 含义如下:第 1 行“1-1,5”中 1-1 表示 1 楼 1 号区域,5 表示出现 5 次;第 2 行“14,3”中 1-4 表示 1 楼 4 号区域,3 表示出现 3 次。
# 以下代码为提示框架
# 请在...处使用一行或多行代码替换
# 请在______处使用一行代码替换
# 打开sensor.txt来读取数据
# 创建earpa001.txt来写入数据
with open('earpa001.txt', encoding="utf-8")as fn:
with open('earpa001_count.txt', 'w')as fo:
# 创建一个空字典用来存储哪个区域出现了几次
d = {}
for line in fn:
# 一行的内容写入一个列表,每个元素对应每一列的内容
ls = line.strip(" \n").split(",")
# 用site(键)表示几楼几号区域
site= ls[2] + "-" + ls[3]
# 值为出现的次数
d[site] = d.get(site, 0) + 1
ls = list(d.items())
ls.sort(key=lambda x: x[1], reverse=True) # ¸ÃÓï¾äÓÃÓÚÅÅÐò
# 将相关内容写入文件
for i in range(len(ls)):
fo.write('{},{}\n'.format(ls[i][0], ls[i][1]))