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

先占坑 晚上再写

神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为该行的字符串  此处为line
def 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值