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迭代和迭代器
Mar 28 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
Jul 02 Python
TensorFlow安装及jupyter notebook配置方法
Sep 08 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
May 15 Python
django admin后台添加导出excel功能示例代码
May 15 Python
Django框架模型简单介绍与使用分析
Jul 18 Python
Python中拆分字符串的操作方法
Jul 23 Python
Python基于WordCloud制作词云图
Nov 29 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
Feb 21 Python
python golang中grpc 使用示例代码详解
Jun 03 Python
如何基于Python和Flask编写Prometheus监控
Nov 25 Python
python实现图像随机裁剪的示例代码
Dec 10 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 simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
JavaScript 页面编码与浏览器类型判断代码
2010/06/03 Javascript
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
2014/06/26 Javascript
JS简单计算器实例
2015/01/20 Javascript
js选项卡的实现方法
2015/02/09 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
vue动态组件实现选项卡切换效果
2017/03/08 Javascript
webpack写jquery插件的环境配置
2017/12/21 jQuery
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
2018/02/12 jQuery
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
vue内置组件component--通过is属性动态渲染组件操作
2020/07/28 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
Python脚本实现代码行数统计代码分享
2015/03/10 Python
详细介绍Ruby中的正则表达式
2015/04/10 Python
python输出指定月份日历的方法
2015/04/23 Python
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
Python字符串格式化输出方法分析
2016/04/13 Python
python编码总结(编码类型、格式、转码)
2016/07/01 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
一款基于css3和jquery实现的动画显示弹出层按钮教程
2015/01/04 HTML / CSS
世界排名第一的万圣节服装店:Spirit Halloween
2018/10/16 全球购物
阿里巴巴的Oracle DBA笔试题答案-SQL tuning类
2016/04/03 面试题
爷爷追悼会答谢词
2014/01/24 职场文书
欢度春节标语
2014/07/01 职场文书
2015年园林绿化工作总结
2015/05/23 职场文书
网络安全倡议书(3篇)
2019/09/18 职场文书
html+css实现赛博朋克风格按钮
2021/05/26 HTML / CSS
MYSQL 无法识别中文的永久解决方法
2021/06/03 MySQL
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server