python实现电子词典


Posted in Python onMarch 03, 2020

本文实例为大家分享了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实现电子词典

python实现电子词典

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中的魔法方法深入理解
Jul 09 Python
Python实现好友全头像的拼接实例(推荐)
Jun 24 Python
Python退火算法在高次方程的应用
Jul 26 Python
python遍历文件夹找出文件夹后缀为py的文件方法
Oct 21 Python
python中使用 xlwt 操作excel的常见方法与问题
Jan 13 Python
python 利用pandas将arff文件转csv文件的方法
Feb 12 Python
python实现网站用户名密码自动登录功能
Aug 09 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
Apr 18 Python
Django框架序列化与反序列化操作详解
Nov 01 Python
Python关于__name__属性的含义和作用详解
Feb 19 Python
django xadmin action兼容自定义model权限教程
Mar 30 Python
Django项目在pycharm新建的步骤方法
Mar 02 Python
python关于变量名的基础知识点
Mar 03 #Python
python生成13位或16位时间戳以及反向解析时间戳的实例
Mar 03 #Python
python 插入日期数据到Oracle实例
Mar 02 #Python
Python datetime 格式化 明天,昨天实例
Mar 02 #Python
Python MySQL 日期时间格式化作为参数的操作
Mar 02 #Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 #Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
Mar 02 #Python
You might like
php关于array_multisort多维数组排序的使用说明
2011/01/04 PHP
javascript算法学习(直接插入排序)
2011/04/12 Javascript
javascript parseInt() 函数的进制转换注意细节
2013/01/08 Javascript
Jquery动态添加及删除页面节点元素示例代码
2014/06/16 Javascript
javascript实现动态导入js与css等静态资源文件的方法
2015/07/25 Javascript
js实现的动画导航菜单效果代码
2015/09/10 Javascript
AngularJS基础 ng-csp 指令详解
2016/08/01 Javascript
微信小程序 欢迎界面开发的实例详解
2016/11/30 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
vue项目打包部署到服务器的方法示例
2018/08/27 Javascript
Nuxt.js SSR与权限验证的实现
2018/11/21 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
浅谈Django自定义模板标签template_tags的用处
2017/12/20 Python
python如何让类支持比较运算
2018/03/20 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
2018/04/12 Python
Python学习小技巧总结
2018/06/10 Python
Python 删除整个文本中的空格,并实现按行显示
2018/07/24 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
解决Django中多条件查询的问题
2019/07/18 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
台湾网友喜爱的综合型网路购物商城:Yahoo! 奇摩购物中心
2018/03/10 全球购物
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
安康杯竞赛活动总结
2014/05/05 职场文书
红色故事演讲稿
2014/05/22 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
拔河比赛新闻稿
2015/07/17 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书
导游词之云南丽江古城
2019/09/17 职场文书
使用CSS定位HTML元素的实现方法
2022/07/07 HTML / CSS