Python对word文档重排版

2021-03-27 09:27

阅读:767

标签:错误   for   操作   oat   unicode   计算   sum   有一个   文字   

介绍

舍友从网上下载的word题库文档很乱,手动改了大半天才改了一点,想起python是大名鼎鼎的自动化脚本,于是乎开始了python对word的一顿瞎操作。

技术图片

分析需求

对文档中的内容进行分析,只留下题目,选项,并且题号要从1开始。

编写代码

  1. pip安装python-docx模块

  2. 读取word文档内容(如果是以.doc后缀的文件需另存为.docx文件!)

    from docx import Document
    
    # 打开文件
    srcdocx = Document(‘src.docx‘)
    # 遍历所有段落
    for p in srcdocx.paragraphs:
        print(p.text)
    

    输出效果:

    技术图片

  3. 分析所需要删除的内容:

    需求1:
    1
    42.对餐后血糖显著升高的2型糖尿病者,可选用下列哪种药物(5.0分)

    删除多余数字行

    需求2:
    42.对餐后血糖显著升高的2型糖尿病者,可选用下列哪种药物(5.0分)
    修改正确的题目序号

    需求3:
    删除“窗体底端”“窗体顶端”

    需求4:
    A、
    阿卡波糖
    选项合成一行

    需求5:
    删除多余空白行

  4. 编写代码

    本质上来讲,实现就是从源文档中取出一段文字进行处理操作,然后保存到目标文档。

    其中,需求1,3,5的实现,只需要判断一下取出的内容是否是需要删除的内容,如果是,则不用保存到目标文档中,这样就实现了“间接删除”

    对于需求2的实现,通过观察我们不难发现,序号后面总有一个". ",所以我们只需要获取到这个的坐标,把前面的错误序号删除,插入正确的序号到处理字符串,最后保存到新文档,这样就完成了“修正题目序号”

    需求4的实现类似需求2,只需要找到 “、” 符号就行,然后进行类似操作,就能实现 “合并两行”

    from docx import Document
    
    # 判断字符串是否为数字
    def is_number(s):
        try:
            float(s)
            return True
        except ValueError:
            pass
        try:
            import unicodedata
            unicodedata.numeric(s)
            return True
        except (TypeError, ValueError):
            pass
        return False
    
    # 修正错误题目序号
    # src,源字符串 nPos,序号结束下标 cnt,正确序号
    def changeNum(src,nPos,cnt):
        s = src[:0] + src[nPos:]
        str_list = list(s)
        str_list.insert(0, str(cnt))
        dest = ‘‘.join(str_list)
        return dest
        
    # 源文档
    srcdocx = Document(‘src.docx‘)
    # 目标文档
    outDocx = Document()
    idx = 0 # 遍历下标
    length = len(srcdocx.paragraphs) # 总段落数
    cnt = 1 # 遍历序号
    sum = 1 # 修改总次数
    
    while(1):
        if idx >= length:
            break
        src = srcdocx.paragraphs[idx].text
        # 实现需求1,3,5
        if((src == "窗体底端") or (src =="窗体顶端") or (src == "") or (is_number(src))) :
            print(f"正在修改第{sum}处错误 {src}")
            sum = sum + 1 # 计算修改的次数
            idx = idx + 1
            continue
        # 实现需求2
        nPos1 = src.find(".")
        if nPos1 != -1 :
            # 查找到有序号的行
            dest = changeNum(src,nPos1,cnt)
            print(f"正在修改第{sum}处错误 {src}")
            sum = sum + 1 # 计算修改的次数
            cnt = cnt + 1 # 序号后移
            outDocx.add_paragraph(dest) # 写入数据到新word
        # 实现需求4
        nPos2 = src.find(‘、‘)
        if nPos2 != -1 :
            src2 = srcdocx.paragraphs[idx+1].text
            outDocx.add_paragraph(src+src2)
            idx = idx + 1
            print(f"正在修改第{sum}处错误  {src},{src2}")
            sum = sum + 1 # 计算修改的次数
        idx = idx + 1
        
    outDocx.save(‘out.docx‘)
    print(f"修改完成!共计{sum}个错误!")
    

    运行效果:

    技术图片

最终效果

技术图片

总结

Python还是一个极为强大的工具,并且门槛低,易入门,以后我要多多学习Python!如果我的博客能给你点思路,那就发挥了很大的作用了!人生苦短,我用Python~

Python对word文档重排版

标签:错误   for   操作   oat   unicode   计算   sum   有一个   文字   

原文地址:https://www.cnblogs.com/AllenMi/p/13662796.html

上一篇:java制作逻辑的游戏

下一篇:python 函数


评论


亲,登录后才可以留言!