使用Python轻松实现文档编写

Python自动化办公 - 对Word的操作(Python-docx的基本使用) 1 安装模块 Windows用户打开命令行输入:pip install python-docx Mac用户打开终端/Terminal输入:pip3 install python-docx 导入模块:import docx 如果无法安装,可以转换为国内清华镜像源,Windows系统操作如下: 在cmd模式下输入 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx 2 读取Word文档内容 2.1 文档结构 注意:一个ru 阅读详情

图片

使用Microsoft Word、python和python-docx库来简化报告撰写和从报告中提取信息。

图片

使用案例:

  • 读取一个Word文档并进行编辑。

虽然听起来可能不那么令人振奋,但根据支持系统的不同,可以通过巧妙运用这个设置来大大减少制作报告所需的时间。

准备开始:

  • Python3
  • pip3
  • pip3 install python-docx

设置:

代码将在下面分享和解释,但用户可以在GitHub上获取代码的基础版本。强烈建议根据特定用例修改代码,以适应具体使用情况。

开始:

在使用pip3安装python-docx之后,建议将程序拆分为读取两种不同类型内容的部分,即段落和表格。

def tableSearch(doc):
    """ Takes doc file
Purpose: Scrapes all tables and pulls back text
Returns: Dictionary of tables
"""
    tables = {}
    table = 0
    x = 0
    y = 0

    while table != len(doc.tables):
        logging.debug("Table {} Row: {}".format(table, len(doc.tables[table].rows)))
        logging.debug("Table {} Column: {}".format(table, len(doc.tables[table].columns)))
        logging.debug("Table {}".format(table))
        table_test = doc.tables[table]
        run = doc.add_paragraph().add_run()
        font = run.font
        while x != len(table_test.rows):
            while y != len(table_test.columns):
                logging.debug("Table: {}, X: {}, Y: {}\n{}\n".format(table, x,y,table_test.cell(x,y).text))
                tables[str(table)+"."+str(x)+"."+str(y)] = {"row": x, "column": y, "text": table_test.cell(x,y).text}
                y += 1
            x += 1
            y = 0
        x = 0
        y = 0
        table += 1

    return tables


# 读取Word文档
def wordDocx(file):
    """ Takes file
Purpose: Reads the Word Doc
Returns: Nothing
"""
    logging.debug("File: {}".format(file))
    doc = docx.Document(file)
    fullText = []

    for para in doc.paragraphs:
        logging.debug("Paragraph: {}".format(para.text))
        fullText.append(para.text)

    tableInfo = tableSearch(doc)
    return [fullText, tableInfo]

段落:

段落的解析非常简单。它们被设置为一个列表,可以以类似的方式访问(doc.paragraphs[n])。

如果想更改段落中的文本,只需使用下面的代码即可修改文本:

oldText = doc.paragraphs[indexOfParagraph].text

replacedText = oldText.replace("<CLIENT_LONGNAME>",clientLongName)

doc.paragraphs[indexOfParagraph].text = "{} + Text to add".format(oldText)
doc.paragraphs[indexOfParagraph].text = "{} + Replaced text".format(replacedText)

正如上文所述,可以通过制作一个包含关键词(如<CLIENT_LONGNAME>)的普通文档模板,然后使用类似这样的程序去更改每个关键词的所有实例。虽然这也可以通过打开文档并执行查找和替换操作来实现,但支持此操作的基础结构可以使手动更改的快速过程变得更快。

表格:

表格要稍微复杂一些。原因在于表格是二维的,而段落是一维的(段落是0至n的,而表格有一个X坐标和一个Y坐标)。

图片上图展示了一维和二维之间的区别

由于表格的处理方式不同,因此需要一种更复杂的方式来循环遍历所有表格,并索引其中的某些内容。

关于在表格中选择元素的另一个重要注意事项。虽然选择单元格需要使用x和y值,但还需要选择要引用的表格。

table = 0
x = 0
y = 0

while table != len(doc.tables):
    table_test = doc.tables[table]
    while x != len(table_test.rows):
        while y != len(table_test.columns):
            logging.debug("Table: {}, X: {}, Y: {}\n{}\n".format(table, x,y,table_test.cell(x,y).text))
            y += 1
        x += 1
        y = 0
    x = 0
    y = 0
    table += 1

像这样对程序进行迭代有多个目的。

  1. 不论每个表格的结构如何,程序都会以相同方式循环遍历每个表格。
  2. 记录和显示单元格的位置可以进行有趣的集成。

一个有趣集成的例子是创建包含值及其位置的字典,以便插入信息。

虽然为此设计一个查询系统超出了本文的讨论范围,但本文已经提供了一个基本设置,可以帮助你入门:

ref = {
"Date": [0,2,12]
}

info = {
"Date": "08/24/2023"
}

for key,value in ref.items:
    if table == value[0] and x == value[1] and y == value[2]:
        table_test.cell(x,y).text = info[key]

个人笔记:

本文曾经使用类似的程序来解析XML数据,并成功地将处理时间从每份报告需要20-45分钟(XML数据未按良好的方式组织,需要多次查找和交叉引用)降低到0.3秒。考虑到每周需要创建多份报告,这个程序节省下来的时间在一周/一个月/一年的时间里都是可观的。

扩展用途:

尽管阅读本文的大多数人主要关注的是报告的制作,但这些信息在另一个重要方面也非常有用。

有什么比制作一份报告更糟糕的事情?写两份几乎包含相同信息但格式稍有不同的报告。

使用与前面相同的循环系统,还可以让某个程序解析已完成报告中的信息,并将其导出为CSV文件,以便在其他报告撰写程序中使用。本文使用过并推荐的两个报告撰写平台是PlexTrac和AttackForge。这两个平台都允许通过一个特殊格式的CSV文件或JSON文件导入调查结果。

如何简化向其他报告/系统导入信息的过程:

在上面的代码中,每次循环遍历段落或表格中的一个段落或单元格时,都会有代码可以查看对象中的内容。这不仅可以用于调试,本文将文本添加到字典中。这样可以节省从中提取数据的时间,而将更多时间用于解析和重新格式化提取回来的数据。

# 段落
fullText = []
# 表格
tables = {}

fullText.append(para.text)
tables[str(table)+"."+str(x)+"."+str(y)] = {"row": x, "column": y, "text": table_test.cell(x,y).text}

分别添加这几行后,就可以抓取数据,并以类似于访问数据的格式保存数据。一旦获得了数据并知道在哪里可以找到它,就可以在各自的对象中循环遍历,并使用这些数据创建一个新文件。

举个简单的例子,本文将在GitHub上的代码中添加一个函数,将数据保存为CSV格式。

import docx
import logging
import argparse
import re
import sys

logging.basicConfig(level=logging.DEBUG)

# 设置日志记录
def get_arg():
    """ Takes nothing
Purpose: Gets arguments from command line
Returns: Argument's values
"""
    parser = argparse.ArgumentParser()
    # CLI 版本
    # parser.add_argument("-d","--debug",dest="debug",action="store_true",help="Turn on debugging",default=False)
    parser.add_argument("-d","--debug",dest="debug",action="store_false",help="Turn on debugging",default=True)
    # 文件版本
    parser.add_argument("-f","--file",dest="file", help="Name of the Word Doc.")
    parser.add_argument("-o","--output",dest="output", help="Name of the file to output the results.")
    options = parser.parse_args()

    if not options.output:
        options.output = "output.csv"
    if not options.file:
        logging.error("Please provide a file name.")
        sys.exit()

    if options.debug:
        logging.basicConfig(level=logging.DEBUG)
        global DEBUG
        DEBUG = True
    else:
        logging.basicConfig(level=logging.INFO)
    return options


def tableSearch(doc):
    """ Takes doc file
Purpose: Scrapes all tables and pulls back text
Returns: Dictionary of tables
"""
    tables = {}
    table = 0
    x = 0
    y = 0

    while table != len(doc.tables):
        logging.debug("Table {} Row: {}".format(table, len(doc.tables[table].rows)))
        logging.debug("Table {} Column: {}".format(table, len(doc.tables[table].columns)))
        logging.debug("Table {}".format(table))
        table_test = doc.tables[table]
        run = doc.add_paragraph().add_run()
        font = run.font
        while x != len(table_test.rows):
            while y != len(table_test.columns):
                logging.debug("Table: {}, X: {}, Y: {}\n{}\n".format(table, x,y,table_test.cell(x,y).text))
                tables[str(table)+"."+str(x)+"."+str(y)] = {"row": x, "column": y, "text": table_test.cell(x,y).text}
                y += 1
            x += 1
            y = 0
        x = 0
        y = 0
        table += 1

    return tables


# 读取word文档
def wordDocx(file):
    """ Takes file
Purpose: Reads the Word Doc
Returns: Nothing
"""
    logging.debug("File: {}".format(file))
    doc = docx.Document(file)
    fullText = []

    for para in doc.paragraphs:
        logging.debug("Paragraph: {}".format(para.text))
        fullText.append(para.text)

    tableInfo = tableSearch(doc)
    return [fullText, tableInfo]


def infoToCSV(para, table):
    """ Takes a list and a dictionary
Purpose: Convert dictionary and paragraph into a CSV file
Returns: Nothing
"""
    csvHeaders = "Name,Description,Recommendation\n"

    for key, values in table.items():
        Name = ""
        Description= ""
        Recommendation= ""
        nameRegex = re.search("0\.\d+\.1",key) 
        desRegex = re.search("0\.\d+\.3",key)
        recRegex = re.search("0\.\d+\.6",key)
        if nameRegex:
            Name = value["text"]
        if desRegex:
            Description = value["text"]
        if recRegex:
            Recommendation = value["text"]          
        csvHeaders += "{},{},{}\n".format(Name,Description,Recommendation)
    
    for item in para:
        values = re.findall("Name\":\"(.+?)\".+?Description\":\"(.+?)\".+?Recommendation\":\"(.+?)\"",item)
        try:
            csvHeaders += "{},{},{}\n".format(values[0],values[1],values[2])
        except IndexError:
            continue

    f = open("Output.csv", "w")
    f.write(csvHeaders)
    f.close()


def main():
    options = get_arg()
    logging.debug("Options: {}".format(options))
    info = wordDocx(options.file)
    logging.debug("Info: {}".format(info))
    infoToCSV(info[0], info[1])

if __name__ == '__main__':
    main()

需要根据尝试要导入信息的程序来修改infoToCSV函数。虽然这可能有点烦人,但在必须制作多份报告时,在这里花费的5-20分钟来使函数适应需求是值得的。根据本文的经验,手动重新输入这些信息很快就会变得非常枯燥。

局限性:

在本文中,你可能已经注意到没有涉及图片的任何内容。这有一个令人遗憾的原因:python-docx无法处理图片文件,除非在添加图片时使用它,否则它似乎根本不会注意到图片文件。要解决这个问题,要么需要进入库的源代码并对其进行集成,要么需要解压缩.docx文件并解析图像标签的XML,然后从媒体文件夹中查找图片。

本文只是手动将图片添加到使用过的平台上,至少不必复制文本。

关于Python学习指南

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方优快云官方认证二维码或者点击链接免费领取【保证100%免费】

【python-docx】Python读写Word文件 python-docx是一个在Python环境下读写word文档的“利器”。在使用前可以通过pip install python-docx命令安装,再通过import docx 引用即可。下面简单介绍一下 python-docx 的基本操作。 1、新建/打开及保存 文档的新建和打开比较简单,只需要用docx的Document类,若指定路径则是打开文档;若没有指定路径则是新建文档。 对文档... 阅读详情

相关推荐

使用Python轻松批量读取Word文档及各种Word元素的文字内容

本文介绍了如何使用Python批量从Word文档及各种Word元素中提取文本内容。包含详细步骤介绍及代码示例。

nuclear2011的博客 1万+

13.3.1 读取 Word 文档

让我们尝试使用 python-docx 模块。从 http://nostarch.com/automatestuff/下载 demo.docx,并将它保存在当前工作目录中。然后在交互式环境中输入以下代码: >>> import docx ➊ >>> doc = docx.Document('demo.docx') ➋ >>> len(doc.paragraphs) 7 ➌ >>> doc.paragraphs[0...

china365love的博客 583

Python使用pypandoc库调用Pandoc功能轻松实现40+种文档格式的相互转换

Pandoc是一个强大的文档转换工具,支持40多种格式互转。本文介绍了如何通过Python的pypandoc库调用Pandoc功能,包括安装方法和常用转换场景:Markdown与HTML/Word/PDF等格式互转、电子书生成、LaTeX处理等。文章提供了详细的代码示例,并分类列出Pandoc支持的格式类型,同时提醒注意中文支持、格式依赖等技术细节,帮助用户快速实现主流文档格式转换。

漫画之迷学编程 978

python docx文档如何删除段落,Python3如何删除特定行上的空段落pythondocx

from docx import DocumentalphaDic = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','!','?','.','~',',','(',')','$','-',':',';',"'",'/']do...

weixin_32501329的博客 1033

使用Python操作Word文档:轻松实现自动化办公

库是一个用于创建和更新Microsoft Word(.docx)文件的Python库。它支持添加段落、表格、图片、超链接等多种元素,还可以设置字体、颜色、对齐方式等样式。此外,它还支持将Word文档转换为PDF、HTML等其他格式。库是微软COM技术的一个封装,可以实现与Word的交互。通过这个库,可以打开、关闭、保存Word文档,还可以插入文本、图片等元素,以及设置样式等。需要注意的是,这个库只能在Windows系统上使用。

木头大左的博客 549

使用Python-docx库轻松设置段落格式:对齐、缩进等

哈喽,大家好,我是木头左!在编写文档时,段落格式的设置对于提高文档的可读性和美观性至关重要。Python-docx库是一个非常强大的工具,可以帮助轻松地设置段落格式,如对齐、缩进等。本文将详细介绍如何使用Python-docx库设置段落格式。

木头大左的博客 1204

利用Python实现word文档合并

基于python的word文档合并简单实现

m0_46219714的博客 4375

FPGA时钟架构解密:从SRCC/MRCC到全局时钟树的实战指南

本文深入解析Xilinx 7系列FPGA时钟架构,从SRCC/MRCC引脚特性到全局时钟树设计,详细介绍了BUFG、BUFMR等关键组件的应用场景和优化策略。通过对比SRCC与MRCC的驱动范围及适用场景,提供低抖动时钟布线技巧和时钟域交叉(CDC)设计方法,帮助工程师构建高性能FPGA时钟系统。

weixin_29191081的博客 1483

如何使用Python和PaddleOCR轻松识别图片中的文字

设置 PaddleOCR 日志级别为 ERRORtry:print(Fore.RED + '权限错误:' + Style.RESET_ALL)exit()print(Fore.RED + '图片路径错误:' + Style.RESET_ALL, self.img_path)exit()dic = {}path = r'' # 这里换成需要图区文本的图片链接即可,如不修改则使用默认图片if path:print('=' * 30, '提取用户上传图片文本', '=' * 30)

FLK_9090的博客 3689

YOLO26涨点改进 | 检测头Head创新改进篇 | 利用RFAConv感受野注意力卷积改进YOLO26检测头,RFAHead感受野注意力检测头,助力小目标检测高效涨点

YOLO26作为轻量化目标检测模型的新一代标杆,凭借高效的Backbone与Neck结构,在实时检测场景中表现突出,但原生检测头仍存在核心痛点——感受野固定、小目标特征感知薄弱、多尺度目标适配不足,导致在小目标密集、复杂背景遮挡等场景中漏检率偏高、定位精度不足。

qq_36130719的博客 167

基于simulink的低通滤波器(Low-pass Filter, LPF)

摘要:本文详细介绍了如何在Simulink中搭建低通滤波器进行噪声抑制仿真。通过定义系统需求(50Hz信号+250Hz噪声)、添加信号源、设计6阶巴特沃斯低通滤波器(截止频率100Hz)、连接各模块并配置仿真参数,最终实现高频噪声的有效滤除。该教程包含从模型创建到结果分析的完整流程,为信号处理系统开发提供了基础框架,并可进一步扩展为自适应滤波等高级应用。所需MATLAB版本为R2023a及以上,需安装Simulink和DSPSystemToolbox。

amy_mhd的博客 1303

【亲测免费】 Python UDS (ISO-14229) 实现:python-udsoncan

Python UDS (ISO-14229) 实现:python-udsoncan 【下载地址】PythonUDSISO-14229实现python-udsoncan `python-udsoncan` 是一个用 Python 3 编写的 ISO-14229 定义的统一诊断服务 (UDS) 协议的实现。该项目遵循 MIT...

gitblog_09749的博客 1701

piamon实战-- 如何使用 Paimon 的 Java API 实现数据的点查

点查(Point Lookup)是指通过 ​​唯一键(Primary Key)​​ 快速定位并返回单条或少量数据的查询模式。例如:根据用户 ID 查询用户信息、根据订单号查询订单详情等。点查的核心诉求是 ​​低延迟​​ 和 ​​高吞吐​​,适用于实时风控、在线分析等场景。​​定义主键表结构​​,优化数据分布。​​构建过滤条件​​,使用指定查询键。​​执行查询并处理结果​​,结合流式更新实现实时查询。

阿华田的博客 530

python打开电脑文件_python办公自动化:自动打开word文档-docx文件怎样打开

上节python办公自动化:python自动化word快速入门,对python自动化word的操作做了快速入门,从本小节开始,逐步细致的分解讲解每一个关键步骤。python自动化word使用文档python-docx允许您创建新文档以及更改现有文档。实际上,它只允许您更改现有文档; 但如果不存在此文件,将会自动从头开始创建一个。这个功能很强大。文档的主要格式外观取决于删除所有内容时剩下的部分。样式...

weixin_39699163的博客 400

SMMU软件指南SMMU编程之流表(Stream Table)

SMMU使用一组内存中的数据结构来定位翻译数据,详见“转换过程概述”(Translation process overview)。SMMU_(*_)STRTAB_BASE 存储初始结构(流表,Stream Table)的基地址。流表项(Stream Table Entry, STE)包含二级(Stage 2)转换表的基址指针,同时也定位一级(Stage 1)配置结构,这些配置结构包含转换表的基址指针。 传入事务的 StreamID,由 SEC_SID 进行限定,决定了用于查找的流表,并定位相应的STE。

AI-安全-功耗 1188

HTML粉色爱心(完整代码)

HTML语言实现粉色爱心的完整代码。

AIGC 1105

python docx 合并文档 图片_使用Python制作WORD报告

在前面一期文章使用Pandas、Jinja和WeasyPrint制作pdf报告 中我分享了如何使用HTML模板来创建pdf报告的方法。虽然pdf很不错,但更多的人实际上在用微软的WORD来操作文档。实际上对于用户来说,创建所需的模板会更加简单,该模板支持Word中所需的所有自定义格式,而不是尝试使用HTML + CSS。 幸运的是,有一个库支持在python中进行MS Word 邮件合...

weixin_39966130的博客 774

【异常】解决 Cursor 报错 Unexpected seqno: 2 != 1. Please try again, or contact support if the issue 的排坑指南

在使用 Cursor 辅助编程时,你是否遇到过 AI 突然中断输出,并在右下角弹出一个红色的 Network Error 弹窗?今天我们就来彻底解析并解决这个网络断连问题。

奶爸的编程之路,也就一周冷个三天 2469

python word自动排版_用Python实现Word文档的自动比较

我创建了一个更通用的版本,有路径和文件检查,如果有人想要它。。。在#!/usr/bin/python3# This uses win32com to automate the comparison of two Microsoft Word files.# Make sure to have win32com installed for your environment and python ve...

weixin_39527078的博客 811

部分旧版统信国产系统下载资源

注:全部自来网络查找,建议到官网下载最新版。

aggs1990的专栏 5226

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

lisp代码编写地物符号_用MarkDown和Python编写LaTex

前一段时间承包了西电爱数社数学竞赛试题模版的编写,但是用LaTex编写很多复杂的操作都很不方便,尤其是是要用变量的话,虽然LaTex是原生支持的,但是使用起来跟一般编程语言还是差太多了,于是我寻找了一下用编程编写LaTex的方法,就发现了Pylatex。大概总结了下它相对于一般LaTex编写的优势。结构比latex清晰。可以使用编程的逻辑写论文。可以使用Python里面很多优雅的操作。表格、图等东...

weixin_39605521的博客 137

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

用python实现pdf转word_Python实现PDF转Word

”阅读此篇需要三分钟“首先来看看来个PDF文件我们来选择其中一个论文摘要:使用我们的python代码转化后:是不是很神奇?现在网络上大部分的PDF转Word都是收费的,基本都是按页收费,有了我们的python代码后,我们就可以完全免费的将PDF转成Word了,这么好的福利我们赶紧来了解一下吧!首先来看看我们要安装一些什么模块:attrs==17.4.0lxml==4.1.1pdfminer3k==...

weixin_39851048的博客 2803

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

将纯文字PDF转化为Word文档:Python解决方案

pdfplumber。

MinL1ghT的博客 715
上一篇: 发生甚莫事了?我的程序为啥又报错了!
下一篇: 使用Python进行对称和非对称密钥加密和解密
我爱学大模型
博客等级 码龄3年 7883粉丝 687原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值