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 24 Python
Django框架中render_to_response()函数的使用方法
Jul 16 Python
python3制作捧腹网段子页爬虫
Feb 12 Python
python下10个简单实例代码
Nov 15 Python
celery4+django2定时任务的实现代码
Dec 23 Python
Python搭建代理IP池实现存储IP的方法
Oct 27 Python
基于python实现学生信息管理系统
Nov 22 Python
Python文件操作方法详解
Feb 09 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
Python如何优雅删除字符列表空字符及None元素
Jun 25 Python
python/golang 删除链表中的元素
Sep 14 Python
python函数的两种嵌套方法使用
Apr 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缓存机制Output Control详解
2014/07/14 PHP
php 生成签名及验证签名详解
2016/10/26 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
取得传值的函数
2006/10/27 Javascript
jquery HotKeys轻松搞定键盘事件代码
2008/08/30 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
2012/06/20 Javascript
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
JS如何判断移动端访问设备并解析对应CSS
2013/11/27 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
浅谈JavaScript中的字符编码转换问题
2015/07/07 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
vue将对象新增的属性添加到检测序列的方法
2018/02/24 Javascript
vue生成token并保存到本地存储中
2018/07/17 Javascript
对layui中table组件工具栏的使用详解
2019/09/19 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
在vue中axios设置timeout超时的操作
2020/09/04 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
[02:00]最后,我终于出了辉耀
2018/03/27 DOTA
python的正则表达式re模块的常用方法
2013/03/09 Python
python字典基本操作实例分析
2015/07/11 Python
python如何实现内容写在图片上
2018/03/23 Python
Python 实现两个列表里元素对应相乘的方法
2018/11/14 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
CSS3实现苹果手机解锁的字体闪亮效果示例
2021/01/05 HTML / CSS
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
德国购买门票网站:ADticket.de
2019/10/31 全球购物
俄罗斯最大的香水和化妆品网上商店:Randewoo
2020/11/05 全球购物
向领导表决心的话
2014/03/11 职场文书
市级三好学生事迹材料
2014/08/27 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
家长反馈意见及建议
2015/06/03 职场文书
2016大学生形势与政策心得体会
2016/01/12 职场文书
实用求职信模板范文
2019/05/13 职场文书
Elasticsearch 批量操作
2022/04/19 Python