Python帮助 | 从底部读取文本文件数据

3

有人能够看一下我的程序吗?有一个错误我无法识别,真的让我很困惑。同时,请解释一下问题,以便我可以理解如何在其他情况下使用该函数和程序。

input_name = input("\nPlease enter students name » ").strip()
datafile = '1.txt'

while open(datafile, 'r') as f:
    data = {}
    for line in f:
        name, value = line.split('=')
        name = name.strip
        value = str(value)
        data.setdefault(name, []).append(value)
else:
    break
avg = {}
for name, scores in data.items():
    last_scores = scores[-3:]
    avg[name] = sum(last_scores) / len(last_scores)

print("\n", input_name,"'s average score is", avg(input_name))
4个回答

2

单步操作

将所有数据读入字典中:

data = {}
for line in f:
    name, value = line.split('=')
    name = name.strip()
    value = int(value)
    data.setdefault(name, []).append(value)
< p > data 的内容:

{'Chris': [9, 9],
 'John': [6, 4, 5],
 'Sarah': [4, 7],
 'Tanzil': [4, 4, 10, 5, 3],
 'Tom': [2]}

现在您可以计算平均值:
last_scores = data['Tanzil'][-3:]
avg = sum(last_scores) / len(last_scores)


>>> avg
6.0

或者对所有人求平均值:
avg = {}
for name, scores in data.items():
    last_scores = scores[-3:]
    avg[name] = sum(last_scores) / len(last_scores)

现在avg的值为:

{'Chris': 9.0, 'John': 5.0, 'Sarah': 5.5, 'Tanzil': 6.0, 'Tom': 2.0}

显示所有结果:

for name, value in avg.items():
    print(name, value)

打印:

Tanzil 6.0
Chris 9.0
Sarah 5.5
John 5.0
Tom 2.0

或按平均分从高到低排序:
from operator import  itemgetter

for name, value in sorted(avg.items(), key=itemgetter(1), reverse=True):
        print(name, value)

打印:

Chris 9.0
Tanzil 6.0
Sarah 5.5
John 5.0
Tom 2.0

完整程序
input_name = input("\nPlease enter students name » ").strip()
datafile = '1.txt'

with open(datafile, 'r') as f:
    data = {}
    for line in f:
        name, value = line.split('=')
        name = name.strip()
        value = int(value)
        data.setdefault(name, []).append(value)

avg = {}
for name, scores in data.items():
    last_scores = scores[-3:]
    avg[name] = sum(last_scores) / len(last_scores)

print("\n", input_name,"'s average score is", avg[input_name])

我该如何使其在一行中不是相邻地输出每个用户的结果,而是一个接一个地输出? - GameFederer
只需循环遍历字典。我已更新答案。 - Mike Müller
在所有用户的结果按顺序排列成列表后,有没有一种简单的方法将最高用户平均值输出到最低用户? - GameFederer
这个答案的最后补充。;) - Mike Müller

0
希望这有所帮助:
with open('demo.txt','r') as f:
    reversedList=reversed(f.read().splitlines())
    print filter(lambda x:'Tanzil' in x,reversedList)[:3]

输出:

['Tanzil = 3', 'Tanzil = 5', 'Tanzil = 10']

我不仅仅想要它用于“tanzil”,我想要它用于任何输入到变量“name”下的名称。 - GameFederer
它适用于任何变量。只需用“'Tanzil'”替换变量名称即可。您可以创建一个接受名称并返回列表的函数。 - Ahsanul Haque

0

我想以下内容会帮助您完成任务:

  • 将计数器和总和初始化为0,并以倒序读取文件
  • 拆分行并检查第一部分是否为所需名称。如果是,则获取第二部分,将其添加到总和中并增加计数器
  • 当计数器达到3时,退出循环
  • 将总和除以3后打印平均值

    counter, sumTotal = 0, 0
    for line in reversed(open("1.txt").readlines()):
      splitArray = line.split("=")
      if splitArray[0].strip() == name:
        sumTotal = sumTotal + int(splitArray[1].strip())
        counter = counter + 1
      if counter == 3:
        break
    
    if counter == 3:
      print "Average for {0} = {1}".format(name, sumTotal/3)
    else if counter == 0:
      print "Name {0} not found".format(name)
    else:
      print "Name {0} does not have three scores".format(name)
    

0

如果你在Linux系统上,可以使用tac命令(cat的倒序) - 将文件反向连接并打印。

>>> import os
>>> for line in os.popen('tac 1.txt'):
...  do you existing processing here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接