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()

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

(0)

相关推荐

  • 利用python实现命令行有道词典的方法示例

    前言 由于一直用Linux系统,对于词典的支持特别不好,对于我这英语渣渣的人来说,当看英文文档就一直卡壳,之前用惯了有道词典,感觉很不错,虽然有网页版的但是对于全站英文的网页来说并不支持.索性自己实现一个,基于Python编写的小工具实现有道词典,思路也很简单,直接调用有道的api,解析下返回的json就ok了. 只用到了python原生的库,支持python2和python3. 示例代码 #!/usr/bin/env python # -*- coding:utf-8 -*- # API ke

  • python爬虫实现中英翻译词典

    本文实例为大家分享了python爬虫实现中英翻译词典的具体代码,供大家参考,具体内容如下 通过根据某平台的翻译资源,提取出翻译信息,并展示出来,包括输入,翻译,输出三个过程,主要利用python语言实现(python3.6),抓取信息展示. import urllib.request import urllib.parse import json def en_zh(content): url = 'http://fanyi.baidu.com/v2transapi' head = {} hea

  • 使用Python从有道词典网页获取单词翻译

    从有道词典网页获取某单词的中文解释. import re import urllib word=raw_input('input a word\n') url='http://dict.youdao.com/search?q=%s'%word content=urllib.urlopen(url) pattern=re.compile("</h2.*?</ul>",re.DOTALL) result=pattern.search(content.read()).gro

  • 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.

  • python控制台英汉汉英电子词典

    用python实现了下控制台电子词典,数据来自有道,通过向有道发送http表单数据,然后将服务器返回的json数据解析得到翻译结果,代码比较简单,练练手! # coding=utf-8 # Filename: trans.py # Author: qianghaohao(CodeNutter) # Email: codenutter@foxmail.com # Program: 控制台电子词典 # import os import sys import requests import rando

  • PyQt5实现简易电子词典

    PyQt5是python中一个非常实用的GUI编程模块,功能十分强大.刚刚学完了Pyqt的编程,就迫不及待的写出了一个电子词典GUI程序.整个程序使用qt Desiner把整个gui界面做好,槽函数则自己写好的.电子词典实现了查询单词,查询历史记录,收藏和查看单词本的功能,另外为了是程序更加炫酷,还添加了一个启动界面.具体代码如下: 第一个为主程序代码,主要实现槽函数功能. from PyQt5.QtCore import pyqtSlot from PyQt5.QtWidgets import

  • C++多线程实现电子词典

    本文实例为大家分享了C++多线程实现电子词典的具体代码,供大家参考,具体内容如下 // Dictionary.cpp : 定义控制台应用程序的入口点. //vs2013编译 //字典文件:https://pan.baidu.com/s/1YHtwptaq_V8j034U9_J96A #include "stdafx.h" #include <string> #include <vector> #include <iostream> #include

  • python实现电子产品商店

    利用python实现以下功能:基于python下的电子产品商店 电子产品商店 v0.1 请选择商品: ============================= 1       Apple Watch          ¥3299.00 -------------------------------------- 2       AirPods           ¥1288.00 -------------------------------------- 3       Home Pod  

  • C语言实现小型电子词典

    本文实例为大家分享了C语言实现小型词典系统,供大家参考,具体内容如下 1. 题目描述 用C语言编写一个小型词典,用户可以进行英译汉.汉译英.删除修改单词.添加单词等功能. 2.源代码 /* 小型词典系统 版本:0.9 作者:个快快 应用模型:文件增删改查 */ #include <stdio.h> #include <string.h> int worsNumber = 0; //单词数目 //---------------------- //定义结构体存储词典数据 //-----

  • 利用python爬取有道词典的方法

    前言 大家好 ​ 最近python爬虫有点火啊,啥python爬取马保国视频--我也来凑个热闹,今天我们来试着做个翻译软件--不是不是,说错了,今天我们来试着提交翻译内容并爬取翻译结果 主要内容 材料 1.Python 3.8.4 2.电脑一台(应该不至于有"穷苦人家"连一台电脑都没有吧) 3.Google浏览器(其他的也行,但我是用的Google) 写程序前准备 打开Google浏览器,找的有道词典的翻译网页(http://fanyi.youdao.com/) 打开后摁F12打开开发

  • 基于Android的英文词典的实现方法

    英文词典是手机中经常使用的应用.因此,在本文将结合Android来讨论如何实现一个Android版的英文词典.实现英文词典的方法很多.在本文使用了SQLite数据库来保存英文单词信息.系统通过SQLite数据库中保存的单词信息来查找到与指定英文对应的中文信息.当然,实现这样一个英文词典需要解决一系列技术问题.例如,如何将保存英文单词信息的数据库文件随程序(apk文件)一起发布:发布后如何打开数据库:如何在输入前几个字母后,在AutoCompleteTextView组件提示列表中显示以所输入字符串

  • Python代码调试技巧教程详解

    目录 关于代码调试的技巧,我之前写过很多的文章,加起来也有 将近 10 篇了,关注比较早的同学,也应该都有看过. 还没看过的同学,欢迎前往查阅:调试技巧 其中有一篇是关于 pdb 的调试技巧的: 里面介绍了两种 pdb 的调试入口,也是大部分所熟知的. 这里再带大家回顾一下 第一种:指定 -m pdb 来开启 $ python -m pdb pdb_demo.py 第二种:使用 pdb.set_trace() 在代码中设置断点 import pdb pdb.set_trace() 但其实,pdb

  • Python编程中如何捕获警告ps不是捕获异常

    目录 1. 警告不是异常 2. 警告能捕获吗 3. 捕获警告方法一 4. 捕获警告方法二 5. 捕获警告方法三 1. 警告不是异常 你是不是经常在使用一些系统库或者第三方模块的时候,会出现一些既不是异常也不是错误的警告信息? 这些警告信息,有时候非常多,对于新手容易造成一些误判,以为是程序出错了. 实则不然,异常和错误,都是程序出现了一些问题,但是警告不同,他的紧急程度非常之低,以致于大多数的警告都是可以直接忽略的. 如果不想显示这些告警信息,可以直接加上参数 -W ignore 参数,就不会再

随机推荐