读取文件例题总结 python

发布于:2024-05-03 ⋅ 阅读:(29) ⋅ 点赞:(0)

主要是读取文件的操作,结合字典,列表,集合的综合例题

主要思路:先看文件结构 根据文件结构 划分 然后保存到列表中(一般是二维列表) 然后再保存到字典中进行一些列操作

1…学生成绩分析

#1.学生成绩分析
'''
小明,98
小刚,90
小红,91
小王,98
小刘,80
***可以看出每行都有两个数据 以逗号隔开 然后就是换行符了***

'''
#先打开文件
f=open('score.txt','r',encoding='utf-8')
#读取文件内容
# content=f.readlines() #['小明,98\n', '小刚,90\n', '小红,91\n', '小王,98\n', '小刘,80']
#可以看出 格式和上面分析的一样 所以先去除换行符,再按逗号隔开
#综上 可以用列表推导式简写
lst=[i.strip().split(',') for i in f.readlines()] #现在的lst就是名字和成绩的一个二维列表了[['小明', '98'], ['小刚', '90'], ['小红', '91'], ['小王', '98'], ['小刘', '80']]
#现在就可以对这个二维列表进行分析了
#因为是个二维列表 所以遍历拿到成绩就行
lst_score=[int(i[1]) for i in lst] #拿到成绩
#1.  最高分和最低分分别是多少?max min
print(max(lst_score),min(lst_score))
#2.  得最高分的学生有几个?   得最低分的学生有几个 count
max_count=lst_score.count(max(lst_score))
min_count=lst_score.count(min(lst_score))
print(max_count,min_count)
#3.  平均分是多少?
print(sum(lst_score)/len(lst_score))

2.学生成绩分析2

# 2. 学生成绩分析2
'''
小明,98,96
小刚,90,94
小红,90,94
小王,98,96
小刘,80,90
小赵,90,96
同理 先分析结构 每行有三个数据 以逗号隔开 然后是换行符
所以如果只是读取数据的话 结构一个是类似于['小明,98,96\n', '小刚,90,94\n', '小红,90,94\n', ']的一维列表

'''


def read_file(file_name):
   with  open(file_name, 'r', encoding='utf-8') as f:
      data = [i.strip().split(',') for i in
              f.readlines()]  # 先去除换行符 再按逗号隔开 [['小明', '98', '96'], ['小刚', '90', '94'], ['小红', '90', '94'], ['小王', '98', '96'], ['小刘', '80', '90'], ['小赵', '90', '96']]
      
      return data


def get_score():
   data = read_file('score2.txt')
   stu_lst = []
   for item in data:
      name = item[0]
      math = int(item[1])
      chinese = int(item[2])
      stu_lst.append({'name': name, 'math': math, 'chinese': chinese})
   
   math_dict = {}
   chinese_dict = {}
   ys_dict = {}
   max_score = 0
   stu_score = 0
   
   for stu in stu_lst:  # 遍历字典
      name = stu['name']
      math = stu['math']
      chinese = stu['chinese']
      score_sum = math + chinese  # 获取每次数学加语文的总分
      stu_score+=score_sum # 获取总分
      if score_sum > max_score:
         max_score = score_sum  # 获取最大分数
      
      chinese_dict.setdefault(chinese, [])
      chinese_dict[chinese].append(name)  # 把语文分数作为key 语文分数相同的学生名字作为value
      
      math_dict.setdefault(math, [])
      math_dict[math].append(name)  # 把数学分数作为key 数学分数相同的学生名字作为value
      
      ys_dict.setdefault((math, chinese), [])
      ys_dict[(math, chinese)].append(name)  # 把数学分数和语文分数作为key 数学分数和语文分数相同的学生名字作为value
   
   for k, v in math_dict.items():
      if len(v) > 1:
         print(f'数学分数为{k}的学生有{v}')
   print('*' * 20)
   for k, v in chinese_dict.items():
      if len(v) > 1:
         print(f'语文分数为{k}的学生有{v}')
   print('*' * 20)
   for k, v in ys_dict.items():
      sum_score=sum(k)
      if sum_score==max_score:
         print(f'总分最高的同学是:{v},分数为{max_score}')
      if len(v) > 1:
         print(f'数学分数为{k[0]} 语文分数为{k[1]}的学生有{v}')
   
   print(f'总平均分是{stu_score/len(stu_lst):.2f}')
   





get_score()

3.投票选班长

'''
文件data里存储了投票选班长的选票情况

小红
小刚
小明
小明
小刚
小刘
小红
小张
小王
小明
分析文件结构 每行有一个数据 以换行符结束
1.  —共有多少人参加了班长选举?
2.  这些人分别得了多少选票?

'''
with open('data.txt', 'r', encoding='utf-8') as f:
   data = [i.strip() for i in
           f.readlines()]  # 这个文件比较简单只需要去除换行符就行了,得到一个一维列表,['小红', '小刚', '小明', '小明', '小刚', '小刘', '小红', '小张', '小王', '小明']
   stu_dic = {}
   for stu in data:
      stu_dic.setdefault(stu, 0)
      stu_dic[stu] += 1
   # 1.  —共有多少人参加了班长选举?
   print(len(stu_dic))
# 2.  这些人分别得了多少选票?
   for k, v in stu_dic.items():
      print(f'{k}得了{v}票')

4.ip地址

# 4.IP地址分析
'''
已知—个文件名为ip.txt的文件,里面存储了大量ip地址
请编写函数,读取文件并分析数据,根据ip出现次数进行排序,程序最终输出ip 和 出现次       数,从小到大
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.1
192.168.0.4
192.168.0.5
192.168.0.5
192.168.0.2
192.168.0.2
192.168.0.5
分析文件结构 每行有一个数据 以换行符结束
'''
with open('ip.txt', 'r', encoding='utf-8') as f:
   data = [i.strip() for i in
           f.readlines()]  # 这个文件比较简单只需要去除换行符就行了,得到一个一维列表,['192.168.0.1', '192.168.0.2', '192.168.0.3', '192.168.0.1', '192.168.0.4',
   
   # 统计每个ip出现的次数
   dic = {}
   for ip in data:
      dic.setdefault(ip, 0)
      dic[ip] += 1
   
   #对字典进行排序 匿名函数就行
   lst=sorted(dic.items(),key=lambda x:x[1])
   
   # 输出
   for item in lst:
      print(item)

5.含了含有重复的人名,请直接输出出现最多的人名和次数。

'''
双儿 洪七公 赵敏 赵敏 逍遥子 鳌拜 殷天正 金轮法王 乔峰 杨过 洪七公 郭靖
       杨逍 鳌拜 殷天正 段誉 杨逍 慕容复 阿紫 慕容复 郭芙 乔峰 令狐冲 郭芙
       金轮法王 小龙女 杨过 慕容复 梅超风 李莫愁 洪七公 张无忌 梅超风 杨逍
       鳌拜 岳不群 黄药师 黄蓉 段誉 金轮法王 忽必烈 忽必烈 张三丰 乔峰 乔峰
       阿紫 乔峰 金轮法王 袁冠南 张无忌 郭襄 黄蓉 李莫愁 赵敏 赵敏 郭芙 张三丰
       乔峰 赵敏 梅超风 双儿 鳌拜 陈家洛 袁冠南 郭芙 郭芙 杨逍 赵敏 金轮法王
       忽必烈 慕容复 张三丰 赵敏 杨逍 令狐冲 黄药师 袁冠南 杨逍 完颜洪烈 殷天正
       李莫愁 阿紫 逍遥子 乔峰 逍遥子 完颜洪烈 郭芙 杨逍 张无忌 杨过 慕容复
       逍遥子 虚竹 双儿 乔峰 郭芙 黄蓉 李莫愁 陈家洛 杨过 忽必烈 鳌拜 王语嫣
       洪七公 韦小宝 阿朱 梅超风 段誉 岳灵珊 完颜洪烈 乔峰 段誉 杨过 杨过 慕容复
       黄蓉 杨过 阿紫 杨逍 张三丰 张三丰 赵敏 张三丰 杨逍 黄蓉 金轮法王 郭襄
       张三丰 令狐冲 赵敏 郭芙 韦小宝 黄药师 阿紫 韦小宝 金轮法王 杨逍 令狐冲 阿紫
       洪七公 袁冠南 双儿 郭靖 鳌拜 谢逊 阿紫 郭襄 梅超风 张无忌 段誉 忽必烈
       完颜洪烈 双儿 逍遥子 谢逊 完颜洪烈 殷天正 金轮法王 张三丰 双儿 郭襄 阿朱
       郭襄 双儿 李莫愁 郭襄 忽必烈 金轮法王 张无忌 鳌拜 忽必烈 郭襄 令狐冲
       谢逊 梅超风 殷天正 段誉 袁冠南 张三丰 王语嫣 阿紫 谢逊 杨过 郭靖 黄蓉
       双儿 灭绝师太 段誉 张无忌 陈家洛 黄蓉 鳌拜 黄药师 逍遥子 忽必烈 赵敏
       逍遥子 完颜洪烈 金轮法王 双儿 鳌拜 洪七公 郭芙 郭襄 赵敏
       分析文件结构 和前面不同的是 每行有多个数据 以空格隔开 然后是换行符'''
def read_file(filename):
   lst = []
   with open(filename, 'r', encoding='utf-8') as file:  # 指定编码格式为UTF-8
      for line in file:
         # 假设单词之间用空格分隔
         lst.extend(line.strip().split(' ')) #因为这里用的是extend 所以是个一维数组
   return lst


def write_file(filename):
   lst = read_file(filename)
   print(lst)
   # 使用字典统计每个字符出现的次数
   dic = {}
   for item in lst:
      dic.setdefault(item, 0)
      dic[item] += 1
   
   # 找出出现次数最多的字符及其出现次数
   max_value = 0
   name = ''
   for key, value in dic.items():
      if value > max_value:
         max_value = value
         name = key
   
   return f'{name} {max_value}'


if __name__ == '__mai

常规写法

with open('test.txt', 'r', encoding='utf-8') as f:
   # datas=[i.strip() for i in f.readlines()] # 先去除换行符 每行以逗号隔开
   # ['双儿 洪七公 赵敏 赵敏 逍遥子 鳌拜 殷天正 金轮法王 乔峰 杨过 洪七公 郭靖', 得到是这种一维数组
   datas = [i.strip().split(' ') for i in
            f.readlines()]  # [['双儿', '洪七公', '赵敏', '赵敏', '逍遥子', '鳌拜', '殷天正', '金轮法王', '乔峰', '杨过', '洪七公', '郭靖'], 得到的是二维数组

   dic = {}
   for data in datas:
      for item in data: #因为结构和前面的不一样 所以得用双重循环
         dic.setdefault(item, 0)
         dic[item] += 1
   # 输出
# max_count = 0
# max_name = ''
# for k, v in dic.items():
#  if v > max_count:
#     max_count = v
#     max_name = k
# print(max_name, max_count)
#也可以用sorted函数
lst=sorted(dic.items(),key=lambda x:x[1],reverse=True) #降序排序
print(lst[0])

6.水果账单

'''
文件fruits-saturday.txt中保存了小明周六买水果的消费情况
苹果 30.6
 香蕉20.8
 葡萄 15.5
 草莓30.2
 樱桃43.9

请写程序分析

1.  这些水果—共花费了多少钱?
2.  花费最多的水果是哪个

文件fruits-sunday.txt 中保存了小明周日买水果的消费情况
苹果  20.6
香蕉  16.8
樱桃  30.5
大鸭梨  10.5
火龙果  18.8

周六,周日两天,  —共买了多少水果
2.  周六,周日两天都买的水果有哪些?
3.  哪些水果是周日买了而周六没有买的?
4.  两天—共花费了多少钱买水果
5.  哪个水果花费的钱最多,花了多少?

分析文件结构 可以发现每行数据之间用的是空格隔开 然后是换行符


'''


# 读取文件
def read_file(filename):
   info = {}  # 字典 用于存放水果名字和价格
   with open(filename, 'r', encoding='utf-8') as f:
      datas = [i.strip().split() for i in f.readlines()]  # 去除换行符 再按空格隔开')
      for data in datas:
         name = data[0]
         price = float(data[1])
         info[name] = price
   return info


def func1():
   info = read_file('fruits-saturday.txt')
   # 1.这些·水果共花费了多少钱?
   total = 0
   for k, v in info.items():
      total += v
   print(total)
   # 2.花费最多的水果是哪个
   max_price = 0
   max_name = ''
   for k, v in info.items():
      if v > max_price:
         max_price = v
         max_name = k
   print(max_name, max_price)


def func2():
   info1 = read_file('fruits-saturday.txt')
   info2 = read_file('fruits-sunday.txt')
   # 周六,周日两天, 共买了多少水果
   # 用集合更方便
   set1 = set(list(info1.keys()))
   set2 = set(list(info2.keys()))
   print(set1 | set2)
   # 周六,周日两日都买水果有哪些?
   print(set1 & set2)  # 并集
   
   # 哪些水果是周日买了而周六没有买的?
   print(set2 - set1)  # 差集
   
   # 4.两天—共花费了多少钱买水果
   print(sum(list(info1.values())) + sum(list(info2.values())))
   
   # 5.哪个水果花费的钱最多, 花了多少?
   
   name = ''
   max_price = 0
   for k, v in info1.items():
      if v > max_price:
         max_price = v
         name = k

   for k, v in info2.items():
      if v > max_price:
         max_price = v
         name = k
   print(name, max_price)
func1()
func2()

网站公告

今日签到

点亮在社区的每一天
去签到