小工具:查找、高亮及翻译雅思词库外的单词(python-docx)

最近在读经济学人,阅读的时候遇到不认识的单词不想停下来查词典,我寻思如果这些单词的中文解释自动标注在旁边就好了。之前我已经做了个小工具(link),阅读的时候运行程序不断读取剪切板里的英文单词,并生成对应的中文解释,但是我无法在手机上使用程序。为了解决这个问题,我需要利用计算机将文章里我可能不认识的单词自动翻译并标注,这样省去了手机上阅读时的查询过程,从而实现流畅阅读。
############################################################
代码思路
1.以雅思词库(7600)作为我认识的词汇,创建excel文件word_list
(将来会将更多单词写入文件,并利用excel排序维持有序性,也可导出单词到其他英语学习软件进行复习)
2.对文章里的每一个单词,判断是否存在于词库,不存在则写入highlight.txt
(英语中动词可能有不同形式compete-competed-competing,名词可能有复数,解决方案是进行匹配忽略每个单词的后三位,单词长度少于6位的视为简单词,不进行匹配)
3.查找并高亮word文档里出现在highlight.txt文件中的单词
4.翻译highlight.txt文件中的单词写入translate.txt
############################################################
代码实现
1.使用python-docx处理word文档

#得到文章里的每一个单词
document = Document('text.docx')
fullText=[]
for p in document.paragraphs:
    fullText.append(p.text)
str=' '
fullText=str.join(fullText)
fullText = re.sub('[^a-zA-Z ]','',fullText)#将除字母之外的字符去掉,如1000,',……
arr__test =fullText.split()

2.使用openpyxl将excel中的一列转换成一个数组
在这里插入图片描述

#得到词库里的每一个单词
f_highlight = open('highlight.txt','w')
wb=openpyxl.load_workbook('word_list.xlsx')
sheet= wb.active
arr_word_list=list(sheet.columns)[0]

3.excel里的单词已经按照字典序排列,使用二分法判断里的文章单词是否存在于词库(查找结束后会自动打开highlight,txt,有需要的话可以手动删一下地点名词和人名,加快翻译速度)

def binarySearch (arr, l, r, x):
    if r >= l:
        mid = int(l + (r - l)/2)
        if cpr(arr[mid].value,x)==0:
            return 1
        elif cpr(arr[mid].value,x)==1:
            return binarySearch(arr, l, mid-1, x)
        else:
            return binarySearch(arr, mid+1, r, x)
    else:
        return 0
#判断里的文章单词是否存在于词库
for i in range(len(arr__test)):
    if(len(arr__test[i])>5):
        word=arr__test[i].lower()
        result = binarySearch(arr_word_list, 0, len(arr_word_list)-1, word)
        if result==0:
            f_highlight.write(word+"\n");
f_highlight.close()
subprocess.call("highlight.txt",shell=True)
os.system("pause");

4.在word文档中查找并高亮已经写入highlight.txt的单词
在这里插入图片描述

with open('highlight.txt') as f_highlight:
    arr_highlight = f_highlight.read().splitlines()
    for j in range(len(arr_highlight)):
        for paragraph in document.paragraphs:
            if arr_highlight[j] in paragraph.text:
                x = paragraph.text.split(arr_highlight[j])
                #切割后的文本保留在x,删除原有run,将文本内容重新写入段落
                #来实现高亮效果
                paragraph.clear()
                for i in range(len(x)-1):
                    paragraph.add_run(x[i])
                    font = paragraph.add_run(arr_highlight[j]).font
                    font.highlight_color = WD_COLOR_INDEX.YELLOW
                paragraph.add_run(x[-1])
    #统一文档字体样式
    font = document.styles['Normal'].font
    font.name = 'Roboto'
    font.size = Pt(10.5)
    document.save('text.docx')
    f_highlight.close()

paragraph 内部根据不同的文字格式, 划分为一个个的内联块(run),高亮的过程先定位特定单词的位置,将段落切割成特定单词前的句子,特定单词,特定单词后的句子,进而可以对特定单词增加高亮效果。
该方法得到的文档字体样式不统一,需要统一文档字体样式。
5.进行翻译
在这里插入图片描述

f_translate = open('translate.txt','a')
    for i in range(len(arr_highlight)):
        res = requests.get('https://www.youdao.com/w/eng/' + arr_highlight[i]+'/#keyfrom=dict2.index')
        res.raise_for_status()
        exampleSoup = bs4.BeautifulSoup(res.text)
        type(exampleSoup)
        elems = exampleSoup.select('#phrsListTab .trans-container ul li')
        f_translate.write(arr_highlight[i]+" : ")
        for elems in elems:
          str=elems.getText()
          f_translate.write(str+"\n")
    f_translate.close()
    subprocess.call("translate.txt",shell=True)
    os.remove("translate.txt")
    os.remove("highlight.txt")

############################################################
参考材料
python-docx笔记心得
python-docx官方文档
highlight text using python-docx

猜你喜欢

转载自blog.csdn.net/Aren8/article/details/107030827