python-docx高亮单词

本文介绍了一种利用Python自动化处理英文阅读材料的方法,通过比对个人词库,自动识别并翻译未知单词,同时在文档中高亮显示,提升阅读效率。
部署运行你感兴趣的模型镜像

最近在读经济学人,阅读的时候遇到不认识的单词不想停下来查词典,我寻思如果这些单词的中文解释自动标注在旁边就好了。之前我已经做了个小工具(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

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>嗯,用户的问题是关于使用Python批量处理Word文档中的重复试题,需要删除或标记重复内容。首先,我得确定如何处理Word文档。Python处理Word的话,常用的库有python-docx,这个库可以读取和编辑docx文件。用户提到批量处理,所以可能需要遍历多个文件。 接下来是重复试题的判断。试题可能结构复杂,包含文字、图片、公式等。简单的文本比较可能不够,因为格式不同但内容相同的试题会被误判。例如,同一道题可能有不同的排版或者标点符号差异。所以需要提取试题的内容特征,可能需要进行标准化处理,比如去除空格、标点,统一大小写等。 然后,如何识别重复。一种方法是计算每个试题的哈希值,比如MD5或者SHA-1,将标准化后的文本生成哈希,然后比较哈希值是否相同。如果有相同的哈希,则视为重复试题。或者使用相似度算法,如余弦相似度,但这样计算量更大,可能不适合批量处理。 用户需要示例代码,所以得用python-docx来读取文档中的段落、表格、图片等信息。但处理图片和公式可能比较复杂,可能需要提取文本部分。假设用户主要是处理文本试题,那么可以提取每个段落的文本内容,进行标准化处理后比较。 然后,如何处理重复试题。删除或标记,比如用颜色高亮或者添加注释。删除的话,需要定位到具体段落并删除;标记的话,可能需要修改文本样式。 现在,结合引用内容。引用[1]中提到了使用正则表达式统计单词数,可能对处理文本有帮助,比如用正则表达式提取题目编号或内容。引用[2]关于代码缩进的问题,提醒在编写Python代码时注意缩进正确。引用[3]提到Python面试题,可能涉及字符串处理和数据结构,比如用集合来存储已出现的试题哈希,快速查找重复。 可能的步骤: 1. 遍历所有Word文档。 2. 提取每个试题的内容,可能需要根据试题的结构(如题目编号、题干、选项)进行分割。 3. 对每个试题内容进行标准化处理(去空格、转小写,去除标点)。 4. 生成哈希值,存入字典,记录出现次数和位置。 5. 对重复的试题进行删除或标记。 代码示例需要用到python-docx,读取文档,处理段落。可能还需要处理表格中的内容,如果试题在表格里的话。但示例可能先处理段落文本。 潜在的问题:试题可能跨段落,比如题干在一个段落,选项在后续段落。这时候需要确定试题的起始和结束位置,可能需要特定的标识符,比如“题目1”、“答案:”等,或者根据用户的文档结构来定。如果用户没有明确的标识,可能需要更复杂的自然语言处理或模式匹配,这可能比较复杂。 所以,在示例代码中,可能先假设每个试题是一个段落,或者通过特定的分隔符(如“###”或题号)来分割试题。如果用户的文档结构不明确,可能需要进一步询问用户,但根据问题,用户可能需要一个通用的方法,所以可能需要简化处理,比如按段落处理,并比较每个段落的哈希值。 另外,处理重复时,可能需要保留第一个出现的试题,删除后续重复的,或者标记所有重复的。需要根据用户需求来定,但示例代码可能需要参数控制。 最后,给出代码框架,使用python-docx读取文档,处理段落,生成哈希,标记重复。同时提醒用户注意试题的结构复杂性,可能需要调整代码以适应实际情况。</think>### Python批量处理Word文档重复试题的解决方案 ### 一、实现思路 1. **文档解析**:使用`python-docx`库读取Word内容,提取文本和格式信息[^3] 2. **重复检测**:通过哈希算法(如MD5)识别重复内容,支持文本标准化(去除空格/标点/大小写) 3. **批量处理**:遍历指定目录下的所有`.docx`文件 4. **标记策略**:通过字体颜色(红色)或批注标记重复试题 ### 二、示例代码 ```python from docx import Document from docx.shared import RGBColor import hashlib import os def process_docs(folder_path): seen = {} # 存储哈希值与文件路径的映射 for filename in os.listdir(folder_path): if filename.endswith('.docx'): doc_path = os.path.join(folder_path, filename) doc = Document(doc_path) for para in doc.paragraphs: # 标准化处理 clean_text = para.text.strip().lower().replace(' ', '') clean_text = ''.join(e for e in clean_text if e.isalnum()) if len(clean_text) < 20: # 忽略短文本 continue # 生成哈希 text_hash = hashlib.md5(clean_text.encode()).hexdigest() if text_hash in seen: # 标记重复段落为红色 for run in para.runs: run.font.color.rgb = RGBColor(255, 0, 0) # 可选:添加删除线 # para.add_comment(f"重复内容,原始文件:{seen[text_hash]}", author="系统") else: seen[text_hash] = filename doc.save(f'processed_{filename}') # 使用示例 process_docs('./word_docs') ``` ### 三、关键改进点 1. **智能过滤**:通过`len(clean_text) < 20`跳过页眉/页码等干扰内容 2. **格式保留**:使用`run.font.color`保持原有格式仅修改颜色 3. **跨文件检测**:全局`seen`字典实现多文档间的重复检测 4. **批注支持**:被注释的`add_comment`方法可记录原始出处 ### 四、注意事项 1. **复杂内容处理**:代码目前处理纯文本段落,若试题包含表格/图片需扩展解析逻辑 2. **性能优化**:处理100+文档时建议添加进度提示 3. **备份机制**:输出文件使用`processed_`前缀保留原始文件 4. **格式兼容性**:需确保所有Word文档为`.docx`格式
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值