当前位置:   article > 正文

python智能联系人管理_基于python的智能联系人管理应用设计

基于python的智能联系人管理应用设计

示例简介

python利用百度文字识别功能,实现对上传的名片进行扫描,并获取名片信息;可查看名片原图,也可以保存信息到Excel。

开发环境:Windows7+python3.7+pycharm2018.2.4(开发工具);

目录机构:

最终效果:

百度端创建应用

创建过程参考《微信小程序利用百度AI实现扫描身份证获取信息功能》(把“图像识别”换为“文字识别”)。

实现过程

一、阅读器UI设计

1. 安装模块和配置工具,参考《python实现小说阅读器》

2. 运行工具QtDesigner,利用QtDesigner工具箱设计出界面效果(所需要的控件可查看右边区域),保存效果为文件bc.ui;

3. 对文件bc.ui执行pyUIC(ui转化为py代码),执行完生成文件bc.py。

二、代码设计

1. 新建文件bc_main.py,该文件为项目主文件,初始化页面并显示;

2. 添加内置模块(下面代码使用)和主方法(用于运行后弹出界面);

Tips:由于是引入bc(bc.py),而未对其修改,所以开发过程中可以随时修改设计重新生成bc.py,不会覆盖掉自己编写的代码;但要注意如果修改了表单属性和名称等,编写的代码要跟着修改;

  1. from PyQt5.QtWidgets import *
  2. from PyQt5.QtGui import *
  3. # 引入自定义模块
  4. import bc
  5. # 引入内置模块
  6. import sys
  7. import os
  8. # 引入第三方模块
  9. import pandas as pd
  10. import requests, base64
  11. from PIL import Image
  12. import phone
  13. # 文字识别sdk所需要模块
  14. from aip import AipOcr
  1. class parentWindow(QWidget,bc.Ui_Form):
  2. # 初始化方法
  3. def __init__(self):
  4. # 找到父类 首页面
  5. super(parentWindow, self).__init__()
  6. # 初始化页面方法
  7. self.setupUi(self)
  8. # 点击选择名片
  9. self.selectCard.clicked.connect(self.openfile)
  10. # 点击查看名片
  11. self.viewButton.clicked.connect(self.viewbtn)
  12. # 点击保存按钮
  13. self.saveButton.clicked.connect(self.saveData)
  1. if __name__=='__main__':
  2. # 每一个PyQt5应用都必须创建一个应用对象
  3. app=QApplication(sys.argv)
  4. # 初始化页面
  5. window=parentWindow()
  6. # 显示首页
  7. window.show()
  8. sys.exit(app.exec_())

3. 添加公共代码,用来判断“名片信息表.xlsx”是否存在,不存在则新建该文件并定义好列名;

  1. # 获取当前路径
  2. cdir = os.getcwd()
  3. # 文件路径
  4. path = cdir+'/名片信息表.xlsx'
  5. # 读取路径 判断是否创建了文件
  6. if not os.path.exists(path):
  7. # 根据路径建立文件夹
  8. # os.makedirs(path)
  9. # 姓名 手机 电话 邮箱 网址 公司 地址 城市
  10. cardfile = pd.DataFrame(columns=['name', 'mobile', 'tel', 'email', 'url', 'comp', 'addr', 'city'])
  11. # 生成xlsx文件
  12. cardfile.to_excel(path, sheet_name='data', index=None)

4. 添加图片识别函数recgImg,用来扫描图片获取图片信息;而文字识别百度给了两种方法选择,一种使用API(本文使用),详细参考名片识别 - 文字识别OCR;另一种是使用SDK,详细参考名片识别 - 文字识别OCR

  1. # 识别名片图片
  2. def recgImg(self):
  3. # 获取baiduToken
  4. apikey = '你的apikey'
  5. seckey = '你的seckey'
  6. tokenUrl = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + apiKey + '&client_secret=' + seckey
  7. res = requests.get(url=tokenUrl, headers={'content-type': 'application/json; charset=UTF-8'}).json()
  8. baiduToken = res['access_token']
  9. '''
  10. 名片识别(API)
  11. '''
  12. request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/business_card"
  13. # 二进制方式打开图片文件
  14. f = open(self.download_path[0], 'rb')
  15. img = base64.b64encode(f.read())
  16. params = {"image": img}
  17. # access_token = '[调用鉴权接口获取的token]'
  18. request_url = request_url + "?access_token=" + baiduToken
  19. headers = {'content-type': 'application/x-www-form-urlencoded'}
  20. response = requests.post(request_url, data=params, headers=headers)
  21. if response:
  22. print(response.json())
  23. return response.json()
  24. # """ 你的 APPID AK SK(SDK) """
  25. # APP_ID = '你的APP_ID'
  26. # API_KEY = '你的API_KEY'
  27. # SECRET_KEY = '你的SECRET_KEY'
  28. #
  29. # client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
  30. # """ 读取图片 """
  31. # def get_file_content(filePath):
  32. # with open(filePath, 'rb') as fp:
  33. # return fp.read()
  34. #
  35. # image = get_file_content(self.download_path[0])
  36. #
  37. # """ 如果有可选参数 """
  38. # options = {}
  39. # options["language_type"] = "CHN_ENG"
  40. # options["detect_direction"] = "true"
  41. # options["detect_language"] = "true"
  42. # options["probability"] = "false"
  43. #
  44. # """ 调用api"""
  45. # picture_result = client.basicAccurate(image, options) # 返回识别结果
  46. # words_result = picture_result['words_result']
  47. # print(words_result)
  48. # return words_result

5. 实现点击“选择名片”功能,用来扫描选择的名片,并把名片和获取到的名片信息显示到界面;

  1. # 选择名片按钮执行方法
  2. def openfile(self):
  3. # 启动选择文件对话空,查找jpg以及png图片
  4. self.download_path = QFileDialog.getOpenFileName(self, "选择要识别的图片", os.getcwd(), "Image Files(*.jpg *.png)")
  5. # 判断是否选择图片
  6. if not self.download_path[0].strip():
  7. QMessageBox.information(self, '提示信息', '没有选择名片图片')
  8. pass
  9. else:
  10. # pixmap解析图片
  11. pixmap = QPixmap(self.download_path[0])
  12. # 设置图片
  13. self.imgLable.setPixmap(pixmap)
  14. # 让图片自适应label大小
  15. self.imgLable.setScaledContents(True)
  16. try:
  17. # 识别名片图片返回识别结果
  18. content = self.recgImg()
  19. except:
  20. QMessageBox.information(self, '提示信息', '识别错误请重新选择图片')
  21. # 识别图片的数据赋值
  22. words_result = content['words_result']
  23. for key in words_result:
  24. textValue = words_result[key][0]
  25. if key == 'NAME':
  26. self.usLineEdit.setText(textValue)
  27. elif key == 'MOBILE':
  28. self.phoneLineEdit.setText(textValue)
  29. elif key == 'TEL':
  30. self.telLineEdit.setText(textValue)
  31. elif key == 'EMAIL':
  32. self.emailLineEdit.setText(textValue)
  33. elif key == 'URL':
  34. self.urlLineEdit.setText(textValue)
  35. elif key == 'COMPANY':
  36. self.companyLineEdit.setText(textValue)
  37. elif key == 'ADDR':
  38. self.addrLineEdit.setText(textValue)

6. 实现点击“查看名片”功能,用来全屏显示名片图片;

  1. # 点击查看名片显示大图功能
  2. def viewbtn(self):
  3. if self.download_path:
  4. # 使用电脑中的看图工具打开图片
  5. img = Image.open(self.download_path[0])
  6. # 显示图片
  7. img.show()
  8. else:
  9. QMessageBox.information(self, '提示信息', '先选择名片图片')

7. 添加公共函数clearCardData,用来在保存成功后清除图片和名片信息;

  1. # 清理名片数据
  2. def clearCardData(self):
  3. # 去掉历史图片路径
  4. self.download_path = ''
  5. # 移除控件上图片
  6. self.imgLable.setPixmap(QPixmap(""))
  7. # 移除输入框内容
  8. self.usLineEdit.setText("")
  9. self.phoneLineEdit.setText("")
  10. self.telLineEdit.setText("")
  11. self.emailLineEdit.setText("")
  12. self.urlLineEdit.setText("")
  13. self.companyLineEdit.setText("")
  14. self.addrLineEdit.setText("")

8. 实现点击“保存”功能,用来把获取的信息保存到Excel

  1. # 保存名片信息到文档
  2. def saveData(self):
  3. pi_table = pd.read_excel(path, sheet_name='data')
  4. # 获取输出框内容
  5. name = self.usLineEdit.text()
  6. mobile = self.phoneLineEdit.text()
  7. tel = self.telLineEdit.text()
  8. email = self.emailLineEdit.text()
  9. url = self.urlLineEdit.text()
  10. comp = self.companyLineEdit.text()
  11. addr = self.addrLineEdit.text()
  12. # 判断手机号是否为空
  13. if mobile.strip():
  14. # 根据手机号判断区域
  15. try:
  16. info = phone.Phone().find(int(mobile))
  17. except Exception as e:
  18. QMessageBox.critical(self, "错误:", "手机号码不正确!", QMessageBox.Ok) # 弹出提示对话框
  19. self.phoneLineEdit.setFocus() # 让手机文本框获得焦点
  20. return
  21. # 判断手机号是否正确返回信息
  22. if info == None:
  23. city = '其他'
  24. else:
  25. # 正确返回信息获取省
  26. city = info['province']
  27. else:
  28. city = '其他'
  29. # 判断姓名是否为空
  30. if name.strip():
  31. # 添加数据
  32. data = pi_table.append({'name': name,
  33. 'mobile': mobile,
  34. 'tel': tel,
  35. 'email': email,
  36. 'url': url,
  37. 'comp': comp,
  38. 'addr': addr,
  39. 'city': city,
  40. }, ignore_index=True)
  41. # 更新xlsx文件
  42. pd.DataFrame(data).to_excel(path, sheet_name='data', index=False)
  43. # 保存成功
  44. QMessageBox.information(self, '提示信息', '保存成功')
  45. self.clearCardData()
  46. else:
  47. QMessageBox.information(self, '提示信息', '姓名不能为空')
  48. pass

9. 最终合并代码:

  1. from PyQt5.QtWidgets import *
  2. from PyQt5.QtGui import *
  3. # 引入自定义模块
  4. import bc
  5. # 引入内置模块
  6. import sys
  7. import os
  8. # 引入第三方模块
  9. import pandas as pd
  10. import requests, base64
  11. from PIL import Image
  12. import phone
  13. # 文字识别sdk所需要的模块
  14. from aip import AipOcr
  15. # 获取当前路径
  16. cdir = os.getcwd()
  17. # 文件路径
  18. path = cdir+'/名片信息表.xlsx'
  19. # 读取路径 判断是否创建了文件
  20. if not os.path.exists(path):
  21. # 根据路径建立文件夹
  22. # os.makedirs(path)
  23. # 姓名 手机 电话 邮箱 网址 公司 地址 城市
  24. cardfile = pd.DataFrame(columns=['name', 'mobile', 'tel', 'email', 'url', 'comp', 'addr', 'city'])
  25. # 生成xlsx文件
  26. cardfile.to_excel(path, sheet_name='data', index=None)
  27. class parentWindow(QWidget,bc.Ui_Form):
  28. # 初始化方法
  29. def __init__(self):
  30. # 找到父类 首页面
  31. super(parentWindow, self).__init__()
  32. # 初始化页面方法
  33. self.setupUi(self)
  34. # 点击选择名片
  35. self.selectCard.clicked.connect(self.openfile)
  36. # 点击查看名片
  37. self.viewButton.clicked.connect(self.viewbtn)
  38. # 点击保存按钮
  39. self.saveButton.clicked.connect(self.saveData)
  40. #选择名片按钮执行方法
  41. def openfile(self):
  42. # 启动选择文件对话空,查找jpg以及png图片
  43. self.download_path = QFileDialog.getOpenFileName(self, "选择要识别的图片", os.getcwd(), "Image Files(*.jpg *.png)")
  44. # 判断是否选择图片
  45. if not self.download_path[0].strip():
  46. QMessageBox.information(self, '提示信息', '没有选择名片图片')
  47. pass
  48. else:
  49. # pixmap解析图片
  50. pixmap = QPixmap(self.download_path[0])
  51. # 设置图片
  52. self.imgLable.setPixmap(pixmap)
  53. # 让图片自适应label大小
  54. self.imgLable.setScaledContents(True)
  55. try:
  56. # 识别名片图片返回识别结果
  57. content=self.recgImg()
  58. except:
  59. QMessageBox.information(self, '提示信息', '识别错误请重新选择图片')
  60. # 识别图片的数据赋值
  61. words_result = content['words_result']
  62. for key in words_result:
  63. textValue = words_result[key][0]
  64. if key == 'NAME':
  65. self.usLineEdit.setText(textValue)
  66. elif key == 'MOBILE':
  67. self.phoneLineEdit.setText(textValue)
  68. elif key == 'TEL':
  69. self.telLineEdit.setText(textValue)
  70. elif key == 'EMAIL':
  71. self.emailLineEdit.setText(textValue)
  72. elif key == 'URL':
  73. self.urlLineEdit.setText(textValue)
  74. elif key == 'COMPANY':
  75. self.companyLineEdit.setText(textValue)
  76. elif key == 'ADDR':
  77. self.addrLineEdit.setText(textValue)
  78. # 识别名片图片
  79. def recgImg(self):
  80. # 获取baiduToken
  81. apikey = '你的apikey'
  82. seckey = '你的seckey'
  83. tokenUrl = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id='+apikey+'&client_secret='+seckey
  84. res = requests.get(url=tokenUrl, headers={'content-type': 'application/json; charset=UTF-8'}).json()
  85. baiduToken = res['access_token']
  86. '''
  87. 名片识别(API)
  88. '''
  89. request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/business_card"
  90. # 二进制方式打开图片文件
  91. f = open(self.download_path[0], 'rb')
  92. img = base64.b64encode(f.read())
  93. params = {"image": img}
  94. # access_token = '[调用鉴权接口获取的token]'
  95. request_url = request_url + "?access_token=" + baiduToken
  96. headers = {'content-type': 'application/x-www-form-urlencoded'}
  97. response = requests.post(request_url, data=params, headers=headers)
  98. if response:
  99. print(response.json())
  100. return response.json()
  101. # """ 你的 APPID AK SK(SDK) """
  102. # APP_ID = '你的APP_ID'
  103. # API_KEY = '你的API_KEY'
  104. # SECRET_KEY = '你的SECRET_KEY'
  105. #
  106. # client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
  107. # """ 读取图片 """
  108. # def get_file_content(filePath):
  109. # with open(filePath, 'rb') as fp:
  110. # return fp.read()
  111. #
  112. # image = get_file_content(self.download_path[0])
  113. #
  114. # """ 如果有可选参数 """
  115. # options = {}
  116. # options["language_type"] = "CHN_ENG"
  117. # options["detect_direction"] = "true"
  118. # options["detect_language"] = "true"
  119. # options["probability"] = "false"
  120. #
  121. # """ 调用api"""
  122. # picture_result = client.basicAccurate(image, options) # 返回识别结果
  123. # words_result = picture_result['words_result']
  124. # print(words_result)
  125. # return words_result
  126. # 点击查看名片显示大图功能
  127. def viewbtn(self):
  128. if self.download_path:
  129. # 使用电脑中的看图工具打开图片
  130. img = Image.open(self.download_path[0])
  131. # 显示图片
  132. img.show()
  133. else:
  134. QMessageBox.information(self, '提示信息', '先选择名片图片')
  135. # 保存名片信息到文档
  136. def saveData(self):
  137. pi_table = pd.read_excel(path, sheet_name='data')
  138. # 获取输出框内容
  139. name =self.usLineEdit.text()
  140. mobile = self.phoneLineEdit.text()
  141. tel = self.telLineEdit.text()
  142. email = self.emailLineEdit.text()
  143. url = self.urlLineEdit.text()
  144. comp = self.companyLineEdit.text()
  145. addr = self.addrLineEdit.text()
  146. # 判断手机号是否为空
  147. if mobile.strip():
  148. # 根据手机号判断区域
  149. try:
  150. info = phone.Phone().find(int(mobile))
  151. except Exception as e:
  152. QMessageBox.critical(self,"错误:","手机号码不正确!",QMessageBox.Ok) # 弹出提示对话框
  153. self.phoneLineEdit.setFocus() # 让手机文本框获得焦点
  154. return
  155. # 判断手机号是否正确返回信息
  156. if info==None:
  157. city = '其他'
  158. else:
  159. # 正确返回信息获取省
  160. city = info['province']
  161. else:
  162. city = '其他'
  163. # 判断姓名是否为空
  164. if name.strip():
  165. # 添加数据
  166. data = pi_table.append({'name': name,
  167. 'mobile': mobile,
  168. 'tel': tel,
  169. 'email': email,
  170. 'url': url,
  171. 'comp': comp,
  172. 'addr': addr,
  173. 'city': city,
  174. }, ignore_index=True)
  175. # 更新xlsx文件
  176. pd.DataFrame(data).to_excel(path, sheet_name='data', index=False)
  177. # 保存成功
  178. QMessageBox.information(self, '提示信息', '保存成功')
  179. self.clearCardData()
  180. else:
  181. QMessageBox.information(self, '提示信息', '姓名不能为空')
  182. pass
  183. # 清理名片数据
  184. def clearCardData(self):
  185. # 去掉历史图片路径
  186. self.download_path = ''
  187. # 移除控件上图片
  188. self.imgLable.setPixmap(QPixmap(""))
  189. # 移除输入框内容
  190. self.usLineEdit.setText("")
  191. self.phoneLineEdit.setText("")
  192. self.telLineEdit.setText("")
  193. self.emailLineEdit.setText("")
  194. self.urlLineEdit.setText("")
  195. self.companyLineEdit.setText("")
  196. self.addrLineEdit.setText("")
  197. if __name__=='__main__':
  198. # 每一个PyQt5应用都必须创建一个应用对象
  199. app=QApplication(sys.argv)
  200. # 初始化页面
  201. window=parentWindow()
  202. # 显示首页
  203. window.show()
  204. sys.exit(app.exec_())

最后结语

本文利用python+百度文字识别,实现上传名片的扫描,并把图片和获取的信息显示到界面,可点击“查看名片”全屏浏览图片,也可点击“保存”,把信息保存到Excel。

                                                                             扫描公众号,了解更多实例分享

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/609664
推荐阅读
相关标签
  

闽ICP备14008679号