先占坑 晚上再写
神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()
好多东西要修改。