五笔打字通主页
我想把上一篇文章用tkinter做的答题程序做的小程序修改一下,我要把题库源文件由txt文件改成sqlite3数据库,我不想在sqlite编辑软件里手工输入题目及答案等资料,我想找一个可以把我的文本文件转为sqlite数据库文件的工具软件,但是没有找到,于是,我决定自己做一个。
为了以后也可以方便地转化其它的文本文件为sqlite的db文件,我花了一点时间让转化的很多变量可以自定义,如可以自定义题库的地址,数据库名,数据表名,字段名,字段类型,字段大小等。
我发现自己容易出现以下错误:如,在数据一行的最后位置,多输入一个英文逗号,或者,在题库的最后多输入了几个空行,为此,在代码我加入了容错代码。
下面是源代码,源码中大部分都是我以前文章的内容,如果看不明白,可以再回看一下我以前的文章。 丶丌皛
from tkinter import * import sqlite3 from tkinter import messagebox def text2sqlite(): if en1.get()=='' or en2.get()=='' or en3.get()=='' or en4.get()=='' or en5.get()=='': messagebox.showinfo("提示:","每一个文本框都要填入相应的文本才能转换") return str0=en0.get() # 数据库名 str1=en1.get() # 数据表名 str2 = en2.get().split(',') # 字符串分解成字段 名称 列表 str3 = en3.get().split(',') # 字符串分解成字段 类型 列表 str4 = en4.get().split(',') # 字符串分解成字段 长度 列表 str2=[i for i in str2 if i !=''] # 去除因为手误多输入逗号引成的空列表 str3=[i for i in str3 if i !=''] str4=[i for i in str4 if i !=''] if len(str2) != len(str3): messagebox.showinfo("提示:","字段名称与字段类型数量不一") return if len(str2) != len(str4): messagebox.showinfo("提示:","字段名称与字段长度数量不一") return conn=sqlite3.connect(str0+'.db') #创建或打开数据库 cur=conn.cursor() # 创建游标对象 strSQL='create table ' + str1 + ' (' # SQL语句 for i,j in enumerate(str2): if i==0: strSQL=strSQL + str2[i] + ' ' + str3[i] + '(' + str4[i] + ') primary key,' # SQL语句,第1个字段默认为主键 else: strSQL=strSQL + str2[i] + ' ' + str3[i] + '(' + str4[i] + '),' # SQL语句,非主键字段 # print('strSQL??=',strSQL) # 输出SQL语句看看 # 会输出 strSQL??= create table text2sqlite (id INTEGER(10) primary key,timu TEXT(500),da1 TEXT(120),da2 TEXT(120),da3 TEXT(120),da4 TEXT(120),da TEXT(10),bmp TEXT(80), strSQL=strSQL[0:-1] # 去除最后一个逗号 strSQL=strSQL+ ')' # print('strSQL=',strSQL) # 输出SQL语句看看 # 会输出 strSQL= create table text2sqlite (id INTEGER(10) primary key,timu TEXT(500),da1 TEXT(120),da2 TEXT(120),da3 TEXT(120),da4 TEXT(120),da TEXT(10),bmp TEXT(80)) cur.execute(strSQL) # 创建表 strSQL2='insert into ' + str1 + ' ' + str(tuple(str2)) + ' ' + ' values (' + ','.join('?'*len(str2)) + ')' # print('strSQL2=',strSQL2) # 输出SQL2语句,插入记录语句看看 # 会输出 strSQL2= insert into text2sqlite ('id', 'timu', 'da1', 'da2', 'da3', 'da4', 'da', 'bmp') values (?,?,?,?,?,?,?,?) filename=en5.get() with open(filename, 'r', encoding='utf-8') as file: # 只读方式打开编码为utf-8的文本文件 line = file.readlines() # 以读取一行为列表方法读取全部行 j=0 for i in line: j+=1 bb=((str(j) + ','+ line[j-1] ).split(','))[0:len(str2)] # 一行最后多了个英文逗号,或者提供过多的数据,通过 [0:len(str2)] 就只取字段个数的数据 if len(bb)==len(str2): cur.execute(strSQL2,bb) # 表user增加一条记录 else: # 容错,少的的数据行,或空行,就忽略 print('第'+str(j)+'条记录提供的数据少于字段数') cur.close() # 关闭游标对象 conn.commit() # 提交事务 # --- 数据库的增,改,删要提交事务 conn.close() # 关闭连接对象 root=Tk() root.title('text转splite 来自:wb98.com') root.resizable(True,False) root.columnconfigure(0,weight=1) la0=Label(root,text='输入数据库名:') la0.grid(sticky=W,padx=10) en0=Entry(root) en0.grid(sticky=EW,padx=10) la1=Label(root,text='输入数据表名:') la1.grid(sticky=W,padx=10) en1=Entry(root) en1.grid(sticky=EW,padx=10) la2=Label(root,text='输入字段名(以英文逗号分隔):') la2.grid(sticky=W,padx=10) en2=Entry(root) en2.grid(sticky=EW,padx=10) la3=Label(root,text='输入字段类型 (以英文逗号分隔,跟上面的字段名相对应, \ 选项:INTEGER,TEXT,REAL,BLOB) :') la3.grid(sticky=W,padx=10) en3=Entry(root) en3.grid(sticky=EW,padx=10) la4=Label(root,text='输入字段长度(以英文逗号分隔,跟上面的字段名相对应):') la4.grid(sticky=W,padx=10) en4=Entry(root) en4.grid(sticky=EW,padx=10) la3=Label(root,text='输入数据源txt文件地址:') la3.grid(sticky=W,padx=10) en5=Entry(root) en5.grid(sticky=EW,padx=10) but1=Button(root,text=" 开 始 转 换 ",command=text2sqlite) but1.grid(pady=5) en0.insert(END,'student') en1.insert(END,'text2sqlite') en2.insert(END,'id,timu,da1,da2,da3,da4,da,bmp') en3.insert(END,'INTEGER,TEXT,TEXT,TEXT,TEXT,TEXT,TEXT,TEXT') en4.insert(END,'10,500,120,120,120,120,10,80') en5.insert(END,'car3.txt') root.mainloop()
运行结果:
以上代码在win10测试运行成功,转换成功后,会在源码目录里生成 db文件。
db文件内容如下:
对了,我源码中提到的 car3.txt的内容请回看我上一篇文章。
此文章来自:wb98.com 网站还有相关的系列课程文章,感兴趣的可以前往。
来源:济亨网
本文链接:http://wb86.com/post/347.html