Python

Python the difference between re.match and re.findall

1.Usage

 

2. Difference

match will only return one value which is first matched in string, and the type of return value is <class ‘re.Match’>

findall will return all matched options in string , and the type of reutrn value is <class ‘list’>…

Continue reading...

Python生成requirements.txt

忘了一遍又一遍,写下来吧…

安装

 …

Continue reading...

Python编写单词库爬虫解决问题记录

 

序号 问题
1 根据单词词性自动创建字段
2 不同名称但相同功能字段重复创建导致字段冗余
3 同个词性含多个不同位置的中文翻译使sql语句构造时字段重复插入
4 数据存储类型选择不合理导致数据过长无法存储
5 连接超时导致程序退出
6 随机延时访问降低IP被禁几率
7 每隔一定时间休眠程序
8 每次获取到输入后查询单词存在性花费在数据库的时间过长
9 连接错误返回结果为HTML页面,导致音频下载错误

对于1: 获取到单词属性后,比较是否已经创建对应字段,无则创之。

 

对于2: 将相同功能的字段,如 n./adj.    a./ adj.等在获取属性的时候,修改成统一的字符串存储起来,后面进行自动创建工作时才不会创建冗余字段。

 

对于3: 存储已构造sql语句中包含的字段和字段值,之后检测到获取的字段重复,如重复出现翻译的词性是 n. 则忽略此次的sql语句字段添加,并找到上一个重复的字段值,添加回车符后,将此次的翻译结果作为附加的字段值续接在其后进行插入。

 

对于4: 原来用的是varchar,改成text后解决问题

 

对于5: 需捕获超时错误,捕获成功后,重新连接,再次请求数据,为防止网络断开导致死循环,可以添加网络未重连成功的次数,超过一定次数退出程序或者延迟一段时间再进行重连,重连成功后清零该计数值。

 

对于 6 & 7: 用random模块来解决,并计数当前获取的单词数量,超过一定数量,进行长时休眠(10s~30s),然后清零单词数量计数值

 

对于8: 选择一次性获取全部sql数据中的单词,并保存在一个list中,以后每成功写入一个翻译结果,将此新单词附加到list中,用于未来比较。

 

对于9:  用命令 file <filename>检测文件内容是否为HTML,如果是,返回获取音频的函数,进行重新下载,设置最大尝试次数,超过则退出或者放弃本次操作继续执行程序的其他部分。…

Continue reading...

request.Session.get() 报错 ‘latin-1’ codec can’t encode character ‘\u2026’

如果是用了headers参数,可能原因是复制浏览器上的headers的时候,复制到了一些莫名奇妙的字符,像下面的一样:

复制的时候由于没有展开,浏览器便显示成了省略号,关键这省略号还是假的,其实它只有一个字符长度,不是三个小数点,所以导致了编码的错误而报错,解决办法是把这符号改掉,或者在浏览器中展开后再复制:

 …

Continue reading...

Python计算中文字符串长度时的注意事项

Python直接调用len计算出的是字符个数。如下:

如果要得到字节长度可以编码成utf-8格式:

编码成utf-8格式后,一个中文字符占用3个字节,所以长度结果为6。

如下:

Continue reading...

Python 以官方方式连接操作数据库

一: 下载数据库连接器

参考:https://dev.mysql.com/doc/connector-python/en/connector-python-installation-binary.html

 

二:测试连接

参考:https://dev.mysql.com/doc/connector-python/en/connector-python-example-connecting.html

原文导包语句用的是 import mysql.connector ,我这边用python3运行是会报错的,换成上面写的就行了。

 

三:基础操作

数据库创建,新增表项,数据插入及查询:

Continue reading...

Linux屏幕取词翻译 – 思路及实现

前段时间用Python写了个终端版本的谷歌翻译爬虫:https://github.com/poemdistance/google-translate

觉得不太满足,刚好可以在这基础上弄个屏幕取词翻译就好了,要解决的问题有几个:

  1. 鼠标动作监测
  2. 屏幕字符提取
  3. 字符串翻译
  4. 界面显示
  5. 音频播放

一:鼠标动作监测

对于鼠标动作的监测,可以直接操作鼠标设备文件/dev/input/mice来完成,了解一下鼠标接口的相关协议http://www.isdaman.com/alsos/hardware/mouse/ps2interface.htm,可以从mice中读取出几个需要用到的按键信息存储到一个数组中,通过对数组信息的分析推算鼠标动作。

 

二:屏幕字符提取

关于屏幕字符提取,想到几种方法,

一是截图识别,不过准确率不够,实施起来也不算简单;

二是看能否从帧缓冲设备着手直接提取选中的字符,不过,太过底层,涉及的东西又多还都是知识盲区暂时不考虑;

三是用简单粗暴的办法,模拟按键发送Ctrl-C或者Ctrl-Shift-C来完成文本的复制。这个时候需要解决的问题有:

  1. 如何获取剪贴板内容
  2. 如何获取当前窗口的应用名称
  3. 如何模拟按键发送复制操作

因为电脑是Arch+Gnome,底层提供窗口等的服务用的是Xlib,可以从这里入手,另外模拟键盘操作也可以向键盘设备文件写入一定格式的一定数据来完成。

获取窗口应用名称可以打开一个管道执行现有命令,并读取其输出即可。至于为何要获取应用名,是因为对于终端来说,复制操作是ctrl-shift-c而不是ctrl-c,既要区别对待,必然需要先识别出当前窗口属于哪个应用。

屏幕字符提取的具体实现可以看这个项目:https://github.com/poemdistance/Screen-Word-Extraction

 

二更:

最后发现,X服务已经将屏幕中高亮的文本自动提取放置在了Primary Selection里,目前程序已直接从此剪贴板获取选中文本,省略了模拟复制。

 

 

三:字符串翻译

直接用exec函数调用写好的谷歌翻译爬虫即可,项目地址:

https://github.com/poemdistance/google-translate

之后又增加了个百度翻译的爬虫:

https://github.com/poemdistance/baidu-translate 

 

 

四:界面显示

可以采用Gtk完成界面编程,一方检测到有取词动作后进行翻译入口图标的弹出,按下入口图标后跳转到翻译窗口,监听窗口相关事件,完成相应动作,根据翻译结果动态调整显示界面的大小,放置谷歌百度翻译结果的切换按钮,随着窗口尺寸的拖拽,重绘相关控件以及背景图片,以适应新窗口。

另外尽量减少窗口的变化,提高用户体验,当切换到另一个翻译结果界面时,对比最佳界面大小,如果上一次的界面大小已经足够容纳当前窗口,不再重设尺寸。

如果界面弹出后翻译结果没被获取成功,如何在下一次的切换途中重新加载出来。

另中文字符的切割可以先弄懂UTF8编码格式,按照格式特点编写相应代码即可,详情见项目adjustStr.c文件

 

五. 音频播放

音频播放采用GStreamer库来完成,对传入的url进行直接播放,不用再写下载程序,播放逻辑为:播放按钮按下后,调用播放单词读音的回调函数,设置标志变量,切换英音和美音的播放。

 

 

代码架构:

代码整体架构:主函数开启多个线程,分别用于鼠标动作检测、入口图标绘制,翻译界面呈现。

其中检测到取词动作后,调用封装好的函数获取剪贴板内容,送入Python翻译输入端,Python获取的结果按一定格式写入共享内存,约定写入完成标志位用于判断写入完成情况。

C语言段检测到翻译结果获取完成,弹出入口图标,超时或用户区域外单击则销毁图标,点击图标则弹出翻译结果,最后调整字符串,插入到界面,呈现翻译结果。

整个Linux屏幕取词翻译项目见:https://github.com/poemdistance/ScreenTranslation

 

 

更新:

目前程序已添加快速搜索功能(Quick Search),由快捷键调出搜索框,输入后按回车符弹出翻译结果,实现思路:

1. 先是完成了Linux全局键盘监听和快捷键调出搜索框的功能,之后解决了Gtk绑定新的快捷键进行信号触发,进行搜索框的呼出和关闭,注册相关信号回调函数,捕获搜索框对应信号完成文本提取。

2.融合代码到原来工程项目,具体是在原来的项目中新开一个进程运行Quick Search,开辟新的共享内存,使原来的项目能够与Quick Search通信,交换必要信息,告知原项目当前正在运行Quick Search,请求数据写入Python翻译端,并调出翻译界面。

3.Quick Search端检查共享内存相关标志位,在翻译界面打开的状态下,忽略调出搜索框的快捷键操作

 

当然,这里省略了很多内部代码逻辑,有兴趣的话,可以看一下源码:

Linux屏幕取词翻译(适用于如Gnome等基于X server的桌面发行版) — 含界面

 

Quick Search 功能演示:

 …

Continue reading...

Python文件命名的坑

注意千万别用模块名命名文件,不然分分中被自己坑死!!!

因为Python加载模块的时候先从当前路径寻找,没有再在从环境变量中的路径中寻找!!!…

Continue reading...