实用Python程序设计第八周文件处理作业

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

1) id.txt 里面放着学号和姓名,没有排序。姓名很怪,不要在乎
2) finalscore.txt里面放着学生的做题信息。其中第三栏或第四栏是做题数量
   有的学生昵称是学号,有的是姓名,有的是姓名学号都有。只要有学号或姓名,就有效
3) 分数计算办法: 150,260,此后每做一题加44) 生成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文件一致

我写的参考答案:

import re
def chazhao(x,y):
    l=len(y)
    for i in range(l):
        if x in y[i]:
            return i
    return -1

def grade(a):
    if a==1:
        x=50
    elif a==2:
        x=60
    elif a>2:
        x=60+(a-2)*4
    else:
        x=0
    return x

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

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

f=open('grade.txt','w',encoding='utf-8')
f.write("学号\t姓名\t题数\t分数\n")

for x in students:
    l=x.split()
    x1,x2=l[0],l[1]
    if chazhao(x1,score)!=-1 or chazhao(x2,score)!=-1:
        i=chazhao(x1,score)
        if i==-1:
            i=chazhao(x2,score)
        l1=re.split('\t',score[i])
        a=int(l1[3])
        agrade=grade(a)
        f.write("%s\t%s\t%d\t%d\n"%(x1,x2,a,agrade))
    else:
        f.write("%s\t%s\t%d\t%d\n"%(x1,x2,0,0))
f.close()

郭伟老师这门课很有意思!!!特别是布置的作业,有适当的提示,都是在好好听课就能完成的前提下布置的!
比如这题里,老师写的“也许你需要关注这一点,也许并不需要”,“也许你需要关注这一点”指的是要注意有些行题数前面有大学名称,“也许并不需要”指的是用split()后,无论有没有大学名字,题数的下标都是3!
当然了,有可能是我的臆想~

ps.作业地址:

https://www.icourse163.org/learn/PKU-1460924165?tid=1463172441#/learn/hw?id=1237054853

修改了下,因为原题要求在命令行窗口运行

import re
import sys
def chazhao(x,y):
    l=len(y)
    for i in range(l):
        if x in y[i]:
            return i
    return -1

def grade(a):
    if a==1:
        x=50
    elif a==2:
        x=60
    elif a>2:
        x=60+(a-2)*4
    else:
        x=0
    return x

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

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

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

for x in students:
    l=x.split()
    x1,x2=l[0],l[1]
    if chazhao(x1,score)!=-1 or chazhao(x2,score)!=-1:
        i=chazhao(x1,score)
        if i==-1:
            i=chazhao(x2,score)
        l1=re.split('\t',score[i])
        a=int(l1[3])
        agrade=grade(a)
        f.write("%s\t%s\t%d\t%d\n"%(x1,x2,a,agrade))
    else:
        f.write("%s\t%s\t%d\t%d\n"%(x1,x2,0,0))
f.close()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值