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 zip文件 压缩
Dec 24 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
Dec 31 Python
python邮件发送smtplib使用详解
Jun 16 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
May 25 Python
python: 自动安装缺失库文件的方法
Oct 22 Python
flask session组件的使用示例
Dec 25 Python
Python 合并多个TXT文件并统计词频的实现
Aug 23 Python
Python3 文章标题关键字提取的例子
Aug 26 Python
Django框架 querySet功能解析
Sep 04 Python
Python 使用 prettytable 库打印表格美化输出功能
Dec 26 Python
python实现测试工具(二)——简单的ui测试工具
Oct 19 Python
如何利用pygame实现打飞机小游戏
May 30 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
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
神盾加密解密教程(二)PHP 神盾解密
2014/06/08 PHP
PHP+shell实现多线程的方法
2015/07/01 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
TP5多入口设置实例讲解
2020/12/15 PHP
理解Javascript_03_javascript全局观
2010/10/11 Javascript
Jquery命名冲突解决的五种方案分享
2012/03/16 Javascript
40个新鲜出炉的jQuery 插件和免费教程[上]
2012/07/24 Javascript
Extjs改变树节点的勾选状态点击按钮将复选框去掉
2013/11/14 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
2017/02/27 Javascript
如何编写jquery插件
2017/03/29 jQuery
JS使用cookie实现只出现一次的广告代码效果
2017/04/22 Javascript
JS+HTML5实现图片在线预览功能
2017/07/22 Javascript
使用重写url机制实现验证码换一张功能
2017/08/01 Javascript
BootStrap 页签切换失效的解决方法
2017/08/17 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
微信小程序实现上传图片功能
2018/05/28 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
pytorch实现从本地加载 .pth 格式模型
2020/02/14 Python
Django Session和Cookie分别实现记住用户登录状态操作
2020/07/02 Python
python代码能做成软件吗
2020/07/24 Python
h5封装下拉刷新
2020/08/25 HTML / CSS
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
文明家庭先进事迹材
2014/01/27 职场文书
小学开学标语
2014/07/01 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
2015年个人自我剖析材料
2014/12/29 职场文书
运动会开幕式主持词
2015/07/01 职场文书
财务人员廉洁自律心得体会
2016/01/13 职场文书
详解Go与PHP的语法对比
2021/05/29 PHP