python自己做电子词典_python实现电子词典
本文实例为大家分享了python实现电子词典的具体代码,供大家参考,具体内容如下
服务端
#!/usr/bin/env python3
from __future__ import unicode_literals
# coding=utf-8
from socket import *
import os
import pymysql
import time
import sys
import signal
DICT_TEXT = "./dict.txt"
HOST = '0.0.0.0'
PORT = 8000
ADDR = (HOST, PORT)
# 主控制流程
def main():
# 连接数据库
db = pymysql.connect\
('localhost', 'root', '123456', 'dict')
# 创建流式套接字
s = socket()
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
s.bind(ADDR)
s.listen(5)
# 或略子进程退出
signal.signal(signal.SIGCHLD, signal.SIG_IGN)
while True:
try:
c, addr = s.accept()
print("Connect from", addr)
except KeyboardInterrupt:
s.close()
sys.exit("服务器退出")
except Exception as e:
print(e)
continue
# 创建子进程处理客户端请求
pid = os.fork()
if pid == 0:
s.close()
do_child(c, db)
else:
c.close()
def do_child(c, db):
# 循环接收请求
while True:
data = c.recv(128).decode()
print("Request:", data)
if (not data) or data[0] == 'E':
c.close()
sys.exit(0)
elif data[0] == 'R':
do_register(c, db, data)
elif data[0] == "L":
do_login(c, db, data)
elif data[0] == 'Q':
do_query(c, db, data)
elif data[0] == 'H':
do_history(c, db, data)
def do_register(c, db, data):
l = data.split(' ')
name = l[1]
passwd = l[2]
cursor = db.cursor()
sql = \
"select * from user where name='%s'" % name
cursor.execute(sql)
r = cursor.fetchone()
if r != None:
c.send(b'EXISTS')
return
sql = "insert into user (name,passwd)\
values ('%s','%s')" % (name, passwd)
try:
cursor.execute(sql)
db.commit()
c.send(b'OK')
except:
db.rollback()
c.send(b'FALL')
return
else:
print("%s注册成功" % name)
def do_login(c, db, data):
l = data.split(' ')
name = l[1]
passwd = l[2]
cursor = db.cursor()
sql = "select * from user where \
name='%s' and passwd='%s'" % (name, passwd)
cursor.execute(sql)
r = cursor.fetchone()
if r == None:
c.send('用户名或密码不正确'.encode())
else:
c.send(b'OK')
def do_query(c, db, data):
l = data.split(' ')
name = l[1]
word = l[2]
cursor = db.cursor()
def insert_history():
tm = time.ctime()
sql = "insert into hist (name,word,time)\
values ('%s','%s','%s')" % (name, word, tm)
try:
cursor.execute(sql)
db.commit()
except:
db.rollback()
return
try:
f = open(DICT_TEXT, 'rb')
except:
c.send("500 服务端异常".encode())
return
while True:
line = f.readline().decode()
w = line.split(' ')[0]
if (not line) or w > word:
c.send("没找到该单词".encode())
break
elif w == word:
c.send(b'OK')
time.sleep(0.1)
c.send(line.encode())
insert_history()
break
f.close()
def do_history(c, db, data):
name = data.split(' ')[1]
cursor = db.cursor()
try:
sql = "select * from hist \
where name='%s'" % name
cursor.execute(sql)
r = cursor.fetchall()
if not r:
c.send('没有历史记录'.encode())
return
else:
c.send(b'OK')
except:
c.send("数据库查询错误".encode())
return
n = 0
for i in r:
n += 1
# 最多显示10条
if n > 10:
break
time.sleep(0.1)
msg = "%s %s %s" % (i[1], i[2], i[3])
c.send(msg.encode())
time.sleep(0.1)
c.send(b'##')
if __name__ == "__main__":
main()
客户端
#!/usr/bin/env python3
#coding=utf-8
from socket import *
import sys
import getpass
def main():
if len(sys.argv) < 3:
print("argv is error")
return
HOST = sys.argv[1]
PORT = int(sys.argv[2])
ADDR = (HOST,PORT)
s = socket()
s.connect(ADDR)
while True:
print('''\n
===========Welcome=========
--1.注册 2.登录 3.退出--
===========================
''')
try:
cmd = int(input("输入选项>>"))
except Exception:
print("输入命令错误")
continue
if cmd not in [1,2,3]:
print("对不起,没有该命令")
sys.stdin.flush() #清除输入
continue
elif cmd == 1:
name = do_register(s)
if name != 1:
print("注册成功,直接登录!")
login(s,name)
else:
print("注册失败!")
elif cmd == 2:
name = do_login(s)
if name != 1:
print("登录成功!")
login(s,name)
else:
print("登录失败!")
elif cmd == 3:
s.send(b"E")
sys.exit("谢谢使用")
def do_register(s):
while True:
name = input("用户名:")
passwd = getpass.getpass("密 码:")
passwd1 = getpass.getpass("确认密码:")
if (' ' in name) or (' ' in passwd):
print("用户名密码不允许空格")
continue
if passwd != passwd1:
print("两次密码不一致")
continue
msg = "R {} {}".format(name,passwd)
#发送请求
s.send(msg.encode())
#接收回复
data = s.recv(128).decode()
if data == "OK":
return name
elif data == 'EXISTS':
print("该用户已存在")
return 1
else:
return 1
def do_login(s):
name = input("用户名:")
passwd = getpass.getpass("密 码:")
msg = "L {} {}".format(name,passwd)
s.send(msg.encode())
data = s.recv(128).decode()
if data == 'OK':
return name
else:
print(data)
return 1
def login(s,name):
while True:
print('''\n
===========查询界面============
1.查词 2.历史记录 3.注销
=============================
''')
try:
cmd = int(input("输入选项>>"))
except Exception:
print("命令错误")
continue
if cmd not in [1,2,3]:
print("对不起,没有该命令")
sys.stdin.flush() #清除输入
continue
elif cmd == 1:
do_query(s,name)
elif cmd == 2:
do_history(s,name)
elif cmd == 3:
return
def do_query(s,name):
while True:
word = input("单词:")
if word == "##":
break
msg = "Q {} {}".format(name,word)
s.send(msg.encode())
data = s.recv(128).decode()
if data == 'OK':
data = s.recv(2048).decode()
print(data)
else:
print(data)
def do_history(s,name):
msg = "H {}".format(name)
s.send(msg.encode())
data = s.recv(128).decode()
if data == 'OK':
while True:
data = s.recv(1024).decode()
if data == "##":
break
print(data)
else:
print(data)
if __name__ == "__main__":
main()
插入字典
import pymysql
import re
f = open('dict.txt')
db = pymysql.connect\
('localhost','root','123456','dict')
cursor = db.cursor()
for line in f:
try:
l = re.split("[ ]+",line)
except:
pass
sql = "insert into words (word,interpret)\
values ('%s','%s')"%(l[0],' '.join(l[1:]))
try:
cursor.execute(sql)
db.commit()
except:
db.rollback()
f.close()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持python博客。
相关文章:

区块链技术开发三个优势
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 区块链技术开发公司目前的开发空间之大难以述清,尤以对产业转型中的应用较为广泛,但由于区块链技术开发公司目前尚正处风口&…

BZOJ4551: [Tjoi2016Heoi2016]树
BZOJ4551: [Tjoi2016&Heoi2016]树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心。现在他想解决这样一个问题:给定一颗有根树(根为1),有以下两种操作:1. 标记操作:对某个…

电力系统稳定与控制_基于数据驱动的电力系统稳定性分析
上期内容:世界电网大停电的经验和稳定控制的发展高薪诚聘电气工程教师、博士后近期学术会议公告,欢迎参会详情请按下方导引查阅,戳!戳!戳!特别致谢报告专家徐 岩 助理教授专家介绍Dr Yan Xu received th…

git-- 使用
git 使用时两个人冲突: Resolve conflicts 转载于:https://www.cnblogs.com/mafeng/p/5980075.html

以太坊RLP编码规则
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 区块链中以太坊RLP编码规则! RLP(Recursive Length Prefix,递归长度前缀)编码算法,是以太坊中数据序列化/反序列化的主要方法…

openjudge-NOI 2.6基本算法之动态规划 专题题解目录
1、1759 最长上升子序列 2、1768 最大子矩阵 3、1775 采药 4、1808 公共子序列 5、1944 吃糖果 6、1996 登山 7、2000 最长公共子上升序列 8、2718 移动路线 9、2728 摘花生 10、2985 数字组合 11、2988 计算字符串距离 转载于:https://www.cnblogs.com/xqmmcqs/p/5979056.html…

js query复习
jquery:js框架; 主要区别在dom的操作 jq需要引入文件并且引入顺序在最上面; 找元素 操作元素 js:doucument.getElementById..classname,tagname,name jq:$(选择器) dom是js对象 jqDom是jquery对象 操作内容 js:dom.innerHTML(非表单元素) dom.value(表单元素) jq:jqDom.html(…

python 进程池 freeze_support_Python 多进程并发操作中进程池Pool的实例
在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,10几个还好&#…

区块链技术如何改变我们对DNA的看法
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 试想一下,有人得到了你的一些最私人的信息,并用它来攻击你,窃取你的身份,实施诈骗。这对于你来说特别…

input样式和修改
$(.input_class).on(focus,function(event){ if(event.keyCode 13){goSearch()}});input::-webkit-input-placeholder {color:#999; } .input_class{color:#333;border:none;vertical-align: .08rem;background: #F5F5F5;font-size:.65rem; } 转载于:https://www.cnblogs.com/…

python uwsgi_python Web开发你要理解的WSGI uwsgi详解
WSGI协议首先弄清下面几个概念:WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通信…

接口设计文档_app端接口用例设计方法和测试方法(一)
前言接口测试作为测试的重要一环,重点关注的是数据层面的输入输出,今天小编介绍一种常用的接口测试用例设计方法和测试方法,希望对大家有所帮助,由于内容较多,分三次给大家讲解,今天先介绍“请求层面的用例…

一个在raw里面放着数据库文件的网上例子
https://www.cnblogs.com/yutingliuyl/p/6880103.html转载于:https://www.cnblogs.com/strongdady/p/9052046.html

as3绕过策略文件给视频截图
接上篇 http://www.cnblogs.com/DarkMaster/p/5973593.html 这篇同样是在老外博客上找到的,分享给大家,再次感叹老外牛逼啊。 原文地址:http://gamespoweredby.com/blog/2014/11/netstream-playnull-bitmapdata-workaround/ 老规矩直接上关键…

数据库和区块链的异同
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 前几日有好友询问我关于数据库和区块链的异同,我觉得这个问题非常好,今天刚好有空把当时的聊天情况回忆了一下,可…

java并发编程实战:第十六章----Java内存模型
一、什么是内存模型,为什么要使用它 如果缺少同步,那么将会有许多因素使得线程无法立即甚至永远看到一个线程的操作结果 编译器把变量保存在本地寄存器而不是内存中编译器中生成的指令顺序,可以与源代码中的顺序不同处理器采用乱序或并行的方…

子div超出父div_菜鸟学 react props 子到父
我们都知道在 vue 中可以使用事件将子组件的数据传递给父组件,也可以通过拿到父组件的实例直接调用父组件的方法先来个子组件class ChildCom extends React.Component {constructor(props) {super(props)this.state {msg: 这是子元素的数据 hello ChildCom}}sendCh…

Linux笔记:使用Vim编辑器
Vi编辑器是Unix系统上早先的编辑器,在GNU项目将Vi编辑器移植到开源世界时,他们决定对其作一些改进。 于它不再是以前Unix中的那个原始的Vi编辑器了,开发人员也就将它重命名为Vi improved,或Vim。 为了方便使用,几乎所有…

实现中心钱包系统
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 很多业务上去中心化的应用上,需要很多中心化的管理,例如交易所,每秒交易量非常大,这都是 比特币&…

南大算法设计与分析课程OJ答案代码(5)--割点与桥和任务调度问题
问题 A: 割点与桥 时间限制: 1 Sec 内存限制: 5 MB提交: 475 解决: 34提交 状态 算法问答 题目描述 给出一个无向连通图,找到所有的割点和桥输入 第一行:点的个数,如果点个数是n,他们的编号为0 ~ n-1 余下的行:每行…

小程序生命周期_来,简单说说小程序的生命周期?
简单说说小程序的生命周期?在小程序中生命周期分为三大类应用生命周期页面生命周期组件生命周期应用生命周期onLaunch(){ console.log(onLaunch监听小程序初始化);}onShow(){ console.log(onShow监听小程序显示);}onHide() { console.log(onLaunch监听小程序隐藏);}页面生命周…

模板引擎:VelocityFreeMarker(转)
Velocity,名称字面翻译为:速度、速率、迅速,用在Web开发里,用过的人可能不多,大都基本知道和在使用Struts,到底Velocity和Struts(Taglib和Tiles)是如何联系?在技术上Velocity要比Struts Struts(…

去中心化的尺度
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 摘要:有些人因为其底层技术而对区块链感兴趣, 另外一些人对它的商业可能性着迷, 还有一些人关心它的社会和政治影…

在tomcat中用jndi配置数据源启动java web程序
1.在web.xml中添加: <resource-ref> <res-ref-name>jdbc/MTSDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> 2.在tomcat的context.xml中配置数据源:…
centOS7.4服务器 yum安装 搭建lamp环境
// 红色加粗是linux命令安装gcc和gcc-cyum -y install gcc gcc-cyum list httpd*安装apcheyum -y install httpd.x86_64 httpd-devel.x86_64 httpd-tools.x86_64开启服务/bin/systemctl start httpd.service停止服务/bin/systemctl stop httpd.service设置Apache服务开机启动sy…

好想学python怎么猜人_学手艺我好想学个手艺哦可是脑子怎么想也想 – 手机爱问...
2009-03-25学点东西学什么好呢?我今年快40了建议:你以前一直当销售,销售这个职业最大的特点就是说、说、说,跟人打交道最多。那么:(1)如果你厌倦了跟人打交道,厌烦了每天不停跟陌生人说说说的,建…

用Python从零开始创建区块链
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 前言 如果你还没有听说过 3 点钟区块链群,说明你还不是链圈的人;如果你还没有加入 3 点钟区块链群,说明你还不是…

动态添加跨行表格_学会这2招,轻松搞定数据透视表动态更新,效率猛增一倍...
私信回复关键词【福利】,获取丰富办公资源,助你高效办公早下班!Hello,大家好,我是最近在研究数据透视表的小爽~最近,我收到了一个学员的求助:简单归纳一下,这个问题就是:…

alpha阶段个人总结(201521123031林庭亦)
一、个人总结 第一部分:硬的问题 第二部分:软的问题,在成长路上学到了什么? 1 当你看到不靠谱的设计、糟糕的代码、过时的文档和测试用例的时候,不要想 “既然别人的代码已经这样了,我的代码也可以随便一点…

python统计列表内元素个数
代码如下: list01 [a,b,c,a,c] set01 set(list01)print(set01)dict01 {}for item in set01:dict01.update({item:list01.count(item)}) print(dict01)结果: c, b, a} {c: 2, b: 1, a: 2}转载于:https://www.cnblogs.com/zhangyux/p/5999109.html