为啥要编写捐款管理程序,因为管理捐款的人已经穷死了
题目概述:编写一个捐款管理程序,实现将捐款人姓名和所捐款数存入数据文件;读写文件,实现对捐款数据的统计(最大值、平均值)和排序。要求对文件操作中可能出现的异常进行管理。
这道题的重点在将数据以字典的方式写入文件,再将内容从文件中读出来,将读出的字符流转换为字典的形式,再进行相关的数据操作
特别是将读取出来的字符流转换为字典形式,这个点整整卡了我一下午,只能说eval()函数真是个好东西。这是启发我的博客:
Python txt文件读取写入字典的方法(json、eval)
下面为源码
# encoding = 'UTF-8'
donor = {}
# 实现将5人的姓名和捐款数以键值对的方式存入文件
def add_donation():
while True:
name = input('请输入捐款人名字:')
if name == '':
break
money = int(input("请输入捐款数:"))
donor[name] = money
# locals()[name]=money # locals的作用:以字典的形式,返回当前函数内变量名和变量值
with open('donations.txt', 'w+') as f: # 'w+'覆盖写+可读写
f.write(str(donor)) # 文件写入只能写入字符和二进制编码
# 捐款数据排序
def sort(dicts):
donors = sorted(dicts.items(), key=lambda x: x[1], reverse=True) # reverse--排序规则:reverse=True降序,reverse=False升序
return donors
# 统计最大值
def maxmoney(dicts):
maxmoney = max(dicts.values())
return maxmoney
# 统计平均值
def avgmoney(dicts):
len1 = len(dicts) # 取字典中键值对的个数
sum1 = sum(dicts.values()) # 取字典中键对应值的总和
avg = sum1 / len1
return avg
add_donation() # 运行结果为,生成的txt文件里存在一个字典,字典里为5个键值对
try:
with open('donations.txt', 'r') as f: # 此时的f为字符串,需要将f转换为字典类型
d = eval(f.read()) # eval()将读出字符流转换为可执行语句
print('捐款的最大值:', maxmoney(d))
print('捐款的平均值:', avgmoney(d))
print('按捐款大小的排序有:', sort(d))
except:
print('输入的文件有误')
觉得文章有用,请留下你的小赞赞