[TOC]
写这篇文章的缘由
由于学业需要,我每天都药花大量的时间看论文,而且都是英文论文。作为一个工作了几年再读博的老博士,英语已经忘得差不多了。碰到一些难以理解的段落,就需要借助于谷歌翻译等在线的翻译工具。因此,我最经常做的事情就是:在PDF阅读器中复制一段话,再到谷歌翻译的网页中粘贴,看看自己有没有理解错误。比如这样:
我们看到,出现了两个问题:
- 因为换行符造成句子中断,影响了谷歌翻译的准确性。
- 每次都要切换到谷歌翻译的网页,手动粘贴进去,也很麻烦。
这两周一直在看申龙斌的python教程,有一天就突然想要自己动手写个python小程序,来解决我上面碰到的两个问题了。
任务分解
我要写的程序要能够解决上面的两个问题,因此要实现以下功能:
- 能够替换掉PDF文件段落复制时产生的换行符,替换成空格。
- 能够自动打开网页并把翻译结果显示出来。
我们看着两个功能还是太笼统了,仿照申龙斌博客中的思路,按照《如何解题》里面说的,要先把问题分解。1.读取剪贴板,把剪贴板的内容保存成一个字符串2.替换剪贴板里面的换行符为空格3.直接打开替换后的文本的谷歌翻译页面
解决过程
1.读取剪贴板
首先百度以下python读取剪贴板:
比较了一下,发现第二个链接非常的容易懂。使用了一个包叫pyperclip
,这个包里面有两个函数copy()
和paste()
,可以在本文的程序中使用。方法如下:
import pyperclip
pyperclip.copy('Hello world.')
print(pyperclip.paste())
就会输出:Hello world.
上面的两行代码就能够读取剪贴板的内容并打印出来了
2.替换换行符
测试了一下,在PDF文件中复制以后,直接使用pyperclip.paste()
得到的就是文本,类型是Unicode
,查了一下,应该是字符串的一种,可以直接使用python中的字符串的方法。而字符串方法中有一个函数就是replace(‘需要替换的字符’,“想要换成的字符”)
测试一下:
import pyperclip
copyedText= pyperclip.paste()normalizedText = copyedText.replace('\n', ' ')
发现没有反应,于是想到有些换行可能不是\n,也有可能是\r,于是就这样反复尝试,最后发现PDF换行换行很复杂,是\r\n,后来又发现一些小的bug,进行了修改,最终形成的函数是:
normalizedText = copyedText.replace('\r','\\r').replace('\n','\\n').replace('-\\r\\n','').replace("\\r\\n"," ")
至此,已经能够的到正常的文本了
3.直接打开替换后的文本的谷歌翻译页面
Python里面打开网页的函数是webbrowser.open(url)
查看一下刚才的文字翻译的网页的地址:http://translate.google.cn/#en/zh-CN/Abstract%E2%80%94Performing%20predictive%20modelling%2C%20such%20as%20anomaly%0Adetection%2C%20in%20Big%20Data%20is%20a%20difficult%20task.%20This%20problem%20is%0Acompounded%20as%20more%20and%20more%20sources%20of%20Big%20Data%20are%20generated%0Afrom%20environmental%20sensors%2C%20logging%20applications%2C%20and%0Athe%20Internet%20of%20Things.%20Further%2C%20most%20current%20techniques%20for%0Aanomaly%20detection%20only%20consider%20the%20content%20of%20the%20data%20source
可以看出这个地址的结构是这样的:
http://translate.google.cn/#en/zh-CN/sentenceToBeTranslated
那么我们要打开的页面地址就是:
http://translate.google.cn/#en/zh-CN/text_norm
用字符串的方式写就是
url= 'http://translate.google.cn/#en/zh-CN/'+text_norm
然后调用webbrowser来打开新的页面
webbrowser.open(url)
4.设置监听和查重
要让我们的程序不停的监听剪贴板,那么就需要设置一个循环,我这里根据我自己的习惯,设置了每10秒运行一次。
import time
while True:
time.sleep(10)
【上述功能代码】
监听设置以后发现不管你有没有复制新的东西,都会每10秒打开一个新页面,这很不爽,因此加上一个查重:设置一个缓冲,把已经得到的文本存放在copyBuff中,如果新的文本来了就和copyBuff对比一下, 不同就翻译,相同就忽略。
while True:
time.sleep(10)
copyedText=pyperclip.paste()
if copyBuff != copyedText:
copyBuff=copyedText
【上述功能代码】
最终的代码如下:
import pyperclip
import time
import webbrowser
copyBuff=' '
while True:
time.sleep(10)
copyedText=pyperclip.paste()
if copyBuff!=copyedText:
copyBuff=copyedText
normalizedText=copyBuff.replace('\r','\\r').replace('\n','\\n').replace('-\\r\\n','').replace("\\r\\n"," ")
url='http://translate.google.cn/#en/zh-CN/'+normalizedText
webbrowser.open(url)
else:
print('no change')
5.测试一下
打开python程序,从PDF中复制一段文字,稍等片刻,成功了!感谢CCTV……
总结:
- 复杂问题先分解
-
pyperclip
包 -
str.replace()
函数 time.sleep(seconds)
webbrowser.open(url)