关于2016年关于内蒙古高考录取信息的提取和处理

来源:互联网 发布:中国侵略日本 知乎 编辑:程序博客网 时间:2024/04/30 04:55

先占坑 晚上再写

神TM两个月之前的坑。

代码先放上来,等填完现在的这个坑再重构一下这个代码。

# -*- coding: utf-8 -*-import sqlite3#链接数据库conn=sqlite3.connect('test37.db')#打开文件f=open(r'E:\Python27\py\temp\all.txt','r')#数据库_建表conn.execute('''CREATE TABLE student       (       id text PRIMARY KEY     NOT NULL,       name           TEXT    NOT NULL,       sex            text     NOT NULL,       nation        text     not null,       school       text,       major        text,       chinese     text    ,       math         text   ,       synthesis     text   ,       english       text   ,       total0        text   ,       total        text    );''')#变量初始化name='null'firstline=0#第一行 考生号确定schoolline=0#录取信息行确定scoreline=0#成绩代码行确定unadmited=0#没有被录取  1为未被录取  0为被录取item=0#每个考生的项目数  共有 基本信息+院校专业+各科成绩+总成绩   共4项count=0#存入数据库的有效数据个数   有效数据:非蒙古语文考生&&非单考单招考生spoken=0#判断是否有口语成绩   这影响到总成绩的确定mogo=-1#判断是否有蒙古语文     -1为没有  其他为有mogonum=0#统计蒙古语文人数noscorenum=0#统计没有成绩的人数(其他单考单招)#基本确定位置函数  其实只需要第一个和第三个参数   frontspace参数为所需内容位于该行的第几个空格后  lib为该行的字符串  此处为linedef findItem(frontspace,backspace,lib):#    space=0    p1=0    p2=0    for space in range (frontspace):        p1=lib.find(' ',p1+1)#    print p1    for space in range (frontspace+1):        p2=lib.find(' ',p2+1)#    print p2    return lib[p1+1:p2]#数据存储  在最开始代替存入数据库的测试函数  把一个人的所有属性存入统一命名的变量def dataSave(num,name,sex,nation,school,major,chinese,math,synthesis,english,total0,total,count):    print 'the '+count+' data is \n'    print num+name+sex+nation+school+major+chinese+math+synthesis+english+total0+total+'\n'#确定性别   由于在姓名后有不确定数的空格  故用此函数确定性别#10/23更新:strip()方法可以解决这个问题def getSex(frontspace,lib):#    space=0    p1=0    p2=0    p3=0    for space in range (frontspace):        p1=lib.find(' ',p1+1)    # print p1    p2=p1+1    while lib[p2]==' ':        p2=p2+1    # print p2    p3=p2    while lib[p3+1]!=' ':        p3=p3+1;    # print p3    return lib[p2:p3+1]#院校和专业的提取   在后期调试的过程中几乎所有的问题都跟这个函数有关系  def schoolGet(frontspace,backspace,lib):#    space=0    p1=0    p2=0    for space in range (frontspace):        p1=lib.find(' ',p1+1)    # print p1    for space in range (frontspace+1):        p2=lib.find(' ',p2+1)    # print p2    while lib[p1+1]<=chr(127):          p1=p1+1    print str(name)+' schoolGet p1: '+str(p1)    return lib[p1+1:p2]#民族确定   在性别之后def getNation(frontspace,lib):#    space=0    p1=0    p2=0    p3=0    p4=0    for space in range (frontspace):        p1=lib.find(' ',p1+1)    # print p1    p2=p1+1    while lib[p2]==' ':        p2=p2+1    # print p2    p3=p2    while lib[p3+1]!=' ':        p3=p3+1;    # print p3    p4=p3    while lib[p4+2]!=' ':        p4=p4+1    # print p4    return lib[p3+2:p4+2]#主循环for line in f.readlines():    line=line.strip('\n')#去掉行尾的换行符    checkFirstLine=line.find('考生号')#得到第一行  也就是‘考生号’所在的行   也就是一个考生信息的第一行    if checkFirstLine==0:#---------------这种check变量是程序控制的关键变量   先找到所需数据的上一行  即数据的标题  它们是固定的                         #    找到后将firstline置1 然后continue跳过此次循环进入下一循环  即进入下一行  当下一行检测到firstline为1时就开始在这一行查找并存储数据                         #    存储后在将firstline 置0  表示这个人的这项数据已存储完毕        firstline=1#确定了  firstline置1后continue 进入下一行  即需要的数据        print '上一个人是'+str(name)+' 下一行是下一个人的姓名'        continue    if firstline==1:        free=line.find('录取')        free1=line.find('预录取')        if free==-1 or free1!=-1:#如果没找到‘录取’  或者找到了‘预录取’  代表没有被录取  此时unadmited置1  school,major置空            unadmited=1            school='null'            major='null'        num=line[0:14]#考生号  从第一个开始  这个最简单        name=findItem(1,2,line)#姓名        print str(name)        sex=getSex(3,line)#性别        nation=getNation(3,line)#民族        item=item+1#第一项完毕  item+1        firstline=0#firstline置0  为下个考生做准备    checkSchoolLine=line.find('录取层次')    if mogo!=-1:#--------这个忘了 想起来再写 关于蒙古语文的        continue    if checkSchoolLine==0:#录取层次获取        schoolline=1        continue    if schoolline==1:        noscore=line.find('其他单考单招')        if noscore!=-1:            noscore=-1#先将变量置-1  不然会影响到下一个人            unadmited=0            item=0            schoolline=0#以上3个变量全部置为初始值            noscorenum=noscorenum+1#单招计数            print '单招 item = '+str(item)+' unadmited = '+str(unadmited)+' noscore = '+str(noscore)            # chinese='null'            # math='null'            # synthesis='null'            # english='null'            # total='null'            # total0='null'            #-----------原本想在这里把单招的人的分数全部置为Null  后来……嫌麻烦就直接把这个人扔了……反正都是专科的……            continue#执行下一循环  由于控制变量全部置为初始值 下面关于这个人的都无效  直到找到下一个人的考生号信息  就是不要这个人了        school=schoolGet(1,2,line)#学校获取        major=schoolGet(2,3,line)#专业        print '学校 = '+str(school)        schoolline=0        item=item+1#第二项完毕  Item+1    checkScoreLine=line.find('成绩代码')#原理同上    if checkScoreLine==0:        scoreline=1        continue    if scoreline==1:        mogo=line.find('蒙古语文')#判定蒙古语文  这里也出了好多问题        if mogo!=-1:            item=0            scoreline=0#初始化控制变量            mogo=-1#置初始值            mogonum=mogonum+1#计数            unadmited=0#-------------这里出了很多问题   有种情况是这个人既是蒙古语文又没有被录取  unadmited变量就一直是1  导致后面的都存不进去            continue        #成绩存储        chinese=findItem(2,3,line)        math=findItem(5,6,line)        synthesis=findItem(8,9,line)        english=findItem(11,12,line)        print '成绩 = '+str(chinese)        scoreline=2        item=item+1        continue    if scoreline==2:        spoken=line.find('外语口语')#有无口语  关系到总成绩的位置   程序并没有存储口语成绩        if spoken!=-1:            total0=findItem(8,9,line)            total=findItem(11,12,line)        else:            total0=findItem(5,6,line)            total=findItem(8,9,line)        scoreline=0        item=item+1        print 'final item = '+str(item)+' unadmited = '+str(unadmited)    if item+unadmited==4:#判断一个人的信息是否全部采集到  若录取了就是4项都有  item应为4  若未录取就是  item=3  unadmited=1        theNum=num#学号        theName=name#姓名        theSex=sex#性别        theNation=nation#民族        theSchool=school#录取院校        theMajor=major#录取专业        theChinese=chinese#语文        theMath=math#数学        theSynthesis=synthesis#综合  由于是按考生号排序的   文、理科可以直接在考生号上看出来  故在此没有加以区分                              #  区分文理科方法  :  考生号第 10 位    理-> 5   文-> 1        theEnglish=english#英语        theTotal0=total0#总分0(其实原文档是总分一)   不含加分   即裸分、实考分        theTotal=total#总分   含各种加分   一般也是投档分(部分院校除外)        count=count+1#成功存储  计数器+1        #save the data to database        #这是在链接数据库之前模拟数据库的存储  为了测试数据的正确性  有一个print显示数据        dataSave(theNum,theName,theSex,theNation,theSchool,theMajor,theChinese,theMath,theSynthesis,theEnglish,theTotal0,theTotal,str(count))        #sql语句        sql="INSERT INTO student (id,name,sex,nation,school,major,chinese,math,synthesis,english,total0,total)\        VALUES ("+theNum+",\""+theName+"\",\""+theSex+"\",\""+theNation+"\",\""+theSchool+"\",\""+theMajor+"\",\""+theChinese+"\",\""+theMath+"\",\""+theSynthesis+"\",\""+theEnglish+"\",\""+theTotal0+"\",\""+theTotal+"\" )"        print sql        conn.execute(sql);#执行sql语句        conn.commit()        print 'insert db success'        firstline=0#第一行 考生号确定        schoolline=0#录取信息行确定        scoreline=0#成绩代码行确定        unadmited=0#没有被录取  1为未被录取  0为被录取        item=0#每个考生的项目数  共有 基本信息+院校专业+各科成绩+总成绩   共4项        # count=0#存入数据库的有效数据个数   有效数据:非蒙古语文考生&&非单考单招考生        # spoken=0#判断是否有口语成绩   这影响到总成绩的确定        mogo=-1#判断是否有蒙古语文     -1为没有  其他为有        # mogonum=0#统计蒙古语文人数        # noscorenum=0#统计没有成绩的人数(其他单考单招)#程序结束  统计有效数据个数print 'done\nthe number of data is '+str(count)##统计无效数据个数print '蒙古语考生 : '+str(mogonum)+' 单招考生 : '+str(noscorenum)#关闭数据库conn.close()#关闭源文档f.close()

好多东西要修改。

0 0