Python程序设计文件处理作业

作业要求:

要求根据id.txt和finalscore.txt生成学生成绩。文件都是utf-8格式的

1) id.txt 里面放着学号和姓名,没有排序。姓名很怪,不要在乎
2) finalscore.txt里面放着学生的做题信息。其中第三栏或第四栏是做题数量
   有的学生昵称是学号,有的是姓名,有的是姓名学号都有。只要有学号或姓名,就有效
3) 分数计算办法: 1题50,2题60,此后每做一题加4分
4) 生成id.txt里面有的所有学生的成绩,按学号排序输出到指定的结果文件。
如果在 finalscore里面找不到学生的做题记录,该生题数和成绩都记0

结果文件格式如:

学号    姓名    题数    分数
1700943357    玘尜寋    0    0
1700943359    杛旺煃    0    0
1700943383    玘签翢    2    60
1700943405    陕榄伳    0    0
1700943465    匒乡奡    5    72
1700943469    巸俗杽    3    64
1700943472    钬内佦    0    0
1700943481    別珜辽    0    0
1700943523    趂盨淦    7    80


这样的结果可以导入excel表格(拷贝粘贴即可)

id.txt里面没有的学生,不用处理。

注意:源文件和目标文件里面的分隔符,都不是空格,都是制表符 \t (Tab)
注意看finalscore.txt里面,有连着两个 Tab 的情况,比如下面学号和做题数之间是2个tab:


4    1700943836        9


也许你需要关注这一点,也许并不需要

5)程序文件名必须叫count.py。运行时,将count.py和id.txt, finalscore.txt放在相同文件夹下面,
然后在命令行窗口进入该文件夹,以命令行方式运行程序,命令行中可以指定结果文件名:

python count.py XXX.txt 

程序在同一个文件夹下生成结果文件XXX.txt。这个文件名可以随便指定

6)正确的结果已经给出,即ans.txt。最终生成的结果应该和ans.txt文件一致

 

0) 把finalscore用readlines读到一个字符串列表score里面,列表的每个元素都是一行

1) 把 id.txt全部读到一个列表里面,每个元素一行,就是一个学生的信息
   然后把这个列表排序,就得到了按学号排序的学生列表 students

2) 对 students 里的每个元素,split出学号部分和姓名部分,然后到整个 score里面去找,学号部分或姓名部分如果能够在score里面找到,split找到的那个score元素,得到分数,再算成绩,输出。由于数据量不大,所以可以不用字典,集合等。

上代码:不需要考虑什么超时 直接暴力模拟 不难

import sys
import re

def func(x):
    if x < 1:
        return 0
    elif x == 1:
        return 50
    elif x == 2:
        return 60
    else:
        return 60 + (x-2) * 4

def find(x, y):
    for i in range(len(y)):
        if x in y[i]:
            return i
    return -1

f = open("finalscore.txt", "r", encoding="utf-8")
score = f.readlines()
f.close()

f = open("id.txt", "r", encoding="utf-8")
students = f.readlines()
f.close()
students.sort()

f = open(sys.argv[1], 'w', encoding="utf-8")
f.write("学号\t姓名\t题数\t分数\n")

for x in students:
    x1, x2 = x.split()
    i = max(find(x1, score), find(x2, score))
    if i == -1:
        f.write("%s\t%s\t%d\t%d\n" % (x1, x2, 0, 0))
    else:
        lst = re.split("\t", score[i])
        tmp = func(int(lst[3]))
        f.write("%s\t%s\t%s\t%d\n" % (x1, x2, lst[3], tmp))
f.close()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值