【docx模块】python中可以处理word文档的模块

前言

嗨喽~大家好呀,这里是魔王呐 ❤ ~!

今天给大家带来docx模块得介绍以及使用~

一.docx模块

Python可以利用python-docx模块处理word文档,处理方式是面向对象的。

也就是说python-docx模块会把word文档,文档中的段落、文本、字体等都看做对象,对对象进行处理就是对word文档的内容处理。

二.相关概念

如果需要读取word文档中的文字(一般来说,程序也只需要认识word文档中的文字信息),需要先了解python-docx模块的几个概念。

  • Document对象,表示一个word文档。

  • Paragraph对象,表示word文档中的一个段落

  • Paragraph对象的text属性,表示段落中的文本内容。

三.模块的安装和导入

需要注意,python-docx模块安装需要在cmd命令行中输入pip install python-docx,

如下图表示安装成功(最后那句英文Successfully installed,成功地安装完成)

注意:在导入模块时,用的是import docx

四.读取word文本

在了解了上面的信息之后,就很简单了,

下面先创建一个D:\temp\word.docx文件,并在其中输入如下内容。

import docx


file=docx.Document(r"F:\python从入门到放弃\7\2\wenjian.docx")

print('段落:'+str(len(file.paragraphs)))
# 
# for para in file.paragraphs:
#     print(para.text)
    
for i in range(len(file.paragraphs)): 
    print("第"+str(i)+"段的内容是:"+file.paragraphs[i].text)  
import sys

from docx import Document
from docx.shared import Inches

def main():
#     reload(sys)
#     sys.setdefaultencoding('utf-8')

    # 创建文档对象
    document = Document()

    # 设置文档标题,中文要用unicode字符串
    document.add_heading(u'我的一个新文档',0)

    # 往文档中添加段落
    p = document.add_paragraph('This is a paragraph having some ')
    p.add_run('bold ').bold = True
    p.add_run('and some ')
    p.add_run('italic.').italic = True

    # 添加一级标题
    document.add_heading(u'一级标题, level = 1',level = 1)
    document.add_paragraph('Intense quote',style = 'IntenseQuote')

    # 添加无序列表
    document.add_paragraph('first item in unordered list',style = 'ListBullet')

    # 添加有序列表
    document.add_paragraph('first item in ordered list',style = 'ListNumber')
    document.add_paragraph('second item in ordered list',style = 'ListNumber')
    document.add_paragraph('third item in ordered list',style = 'ListNumber')

    # 添加图片,并指定宽度
    document.add_picture('cat.png',width = Inches(2.25))

    # 添加表格: 1行3列
    table = document.add_table(rows = 1,cols = 3)
    # 获取第一行的单元格列表对象
    hdr_cells = table.rows[0].cells
    # 为每一个单元格赋值
    # 注:值都要为字符串类型
    hdr_cells[0].text = 'Name'
    hdr_cells[1].text = 'Age'
    hdr_cells[2].text = 'Tel'
    # 为表格添加一行
    new_cells = table.add_row().cells
    new_cells[0].text = 'Tom'
    new_cells[1].text = '19'
    new_cells[2].text = '12345678'

    # 添加分页符
    document.add_page_break()

    # 往新的一页中添加段落
    p = document.add_paragraph('This is a paragraph in new page.')

    # 保存文档
    document.save('demo1.doc')

if __name__ == '__main__':
    main()

读取表格:

import docx

doc = docx.Document('wenjian.docx')
for table in doc.tables:  # 遍历所有表格
    print('----table------')
    for row in table.rows:  # 遍历表格的所有行
        # row_str = '\t'.join([cell.text for cell in row.cells])  # 一行数据
        # print row_str
        for cell in row.cells:
            print(cell.text, '\t',)
        print() #换行

首先是用docx.Document打开对应的文件目录。

docx文件的结构比较复杂,分为三层,

  • Docment对象表示整个文档;

  • Docment包含了Paragraph对象的列表,Paragraph对象用来表示文档中的段落;

  • 一个Paragraph对象包含Run对象的列表。

因此p.text会打印出整个的文本文档。而用doc.tables来遍历所有的表格。

并且对每个表格通过遍历行,列的方式来得到所有的内容。

但是在运行结果中并没有找到我们插入的文件对象和图片,text.txt文档。

这部分该如何解析呢?

首先我们需要先来认识下docx文档的格式组成:

docx是Microsoft Office2007之后版本使用的,

用新的基于XML的压缩文件格式取代了其目前专有的默认文件格式,

在传统的文件名扩展名后面添加了字母“x”

(即“.docx”取代“.doc”、“.xlsx”取代“.xls”、“.pptx”取代“.ppt”)。

docx格式的文件本质上是一个ZIP文件。

将一个docx文件的后缀改为ZIP后是可以用解压工具打开或是解压的。

事实上,Word2007的基本文件就是ZIP格式的,他可以算作是docx文件的容器。

docx 格式文件的主要内容是保存为XML格式的,但文件并非直接保存于磁盘。

它是保存在一个ZIP文件中,然后取扩展名为docx。

将.docx 格式的文件后缀改为ZIP后解压,

可以看到解压出来的文件夹中有word这样一个文件夹,

它包含了Word文档的大部分内容。

而其中的document.xml文件则包含了文档的主要文本内容

从上面的文档我们可以了解到docx文档实际上是由XML文档打包组成的。

那么我们要得到其中所有的部分,可以用ZIP解压的方式来得到所有的部件。

我们先试下看是否可以

1 将docx文档改成ZIP的后缀

2 解压文件

解压之后得到如下几个文件

点开word文件夹:有如下的文件夹。

document.xml就是描述文本对象的文件

其中embeddings文件中就是我们插入的文本对象text.txt. 是一个bin文件

Media文件中就是存储的图片:

我们通过手动的方式将插入的文本以及图片解析出来,那么通过代码也是同样可以解析的。

代码如下:

os.chdir(r'E:\py_prj')  #首先改变目录到文件的目录

os.rename('test.docx','test.ZIP')  # 重命名为zip文件

f=zipfile.ZipFile('test.zip','r')  #进行解压

for file in f.namelist():

    f.extract(file)

file=open(r'E:\py_prj\word\embeddings\oleObject1.bin','rb').read() #进入文件路径,读取二进制文件。

for f in file:

    print (f)

通过上面的方式,就可以将docx中插入的文件以及图片全部解析出来。

具体docx的写的方式可以参考官方文档的介绍

python资料、源码、教程: 点击此处跳转文末名片获取

尾语 💝

要成功,先发疯,下定决心往前冲!

学习是需要长期坚持的,一步一个脚印地走向未来!

未来的你一定会感谢今天学习的你。

—— 心灵鸡汤

本文章到这里就结束啦~感兴趣的小伙伴可以复制代码去试试哦 😝

👇问题解答 · 源码获取 · 技术交流 · 抱团学习请联系👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/8051.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JDK8和JDK17安装切换,IDEA配置多个版本JDK

文章目录JAVA8不香了?JDK下载JDK安装配置环境变量IDEA中配置多个JDK版本JAVA8不香了? JAVA之父高斯林推荐我们用JDK17,请尽快离开JDK8。JDK17 LTS在每个维度上都是一个巨大的飞跃: 在Java 17正式发布之前,Java开发框架…

ChatGPT中文在线官网-如何与chat GPT对话

怎么下载ChatGPT中文版 ChatGPT是一种基于Transformer架构的自然语言处理技术,其中包含了多个预训练的中文语言模型。这些中文ChatGPT模型大多数发布在Github上,可以通过Github的源码库来下载并使用,包括以下几种方式: 下载预训练…

linux centos 系统提示No space left on device错误 centos清理硬盘空间

一、问题描述 线上的一个centos系统,硬盘满了,通过以下方式清理后,启动程序还是会提示No space left on device错误,具体请看解决方法,这里讲下如何清理硬盘: 1、查看系统磁盘是否已满 df -h 看哪个目录use到100%,我这里是删除过…

Ubuntu22安装OpenJDK

目录 一、是否自带JDK 二、 删除旧JDK(如果自带JDK满足需求就直接使用了) 三、下载OpenJDK 四、新建/home/user/java/文件夹 五、 设置环境变量 六、查看完成 附:完整版连接: 一、是否自带JDK java -version 二、 删除旧…

chatGPT写文章提问词-chatGPT生成论文要多久

让ChatGPT写评论文章 好的,下面是一篇由 ChatGPT 撰写的评论文章: 题目:《流浪地球》:中国科幻电影的里程碑 《流浪地球》是一部改变了中国电影市场的重要电影,它迎来了一个新时代的中国科幻电影。这部电影吸引了众…

ToBeWritten之杂项

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…

ToBeWritten之物联网 BlueTooth/BLE 协议

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…

中金支付经历了4个月完成主要出资人前置审批

2023年4月6日,中国人民银行公示了关于中金支付有限公司的《中国人民银行准予行政许可决定书》(银许准予决字〔2023〕第41号),同意中金支付有限公司主要出资人由中金金融认证中心有限公司变更为广州广电运通金融电子股份有限公司&a…

Charles 安装及配置,详细步骤(不错,保存一下)

一、安装激活 1.1、下载 https://www.charlesproxy.com/download/ 1.2、激活 打开Charles > Help > Register Charles > 输入 Registered Name : https://zhile.io License Key:48891cf209c6d32bf4 二、代理配置 2.1、代理设置 Proxy > Pr…

Linux系统编程(三)—— 文件编程(1)目录和文件

3.1 目录和文件 贯穿始终的例子:做一个类似 ls 命令的实现。如myls 1、命令 (1)一个命令的格式:cmd --长格式 -短格式 非选项的传参 比如 ls --all 和 ls -a,这两个结果是一样的: (2&#x…

00后也太卷了吧!进厂起薪18K,原来面试时候都说了这些......

都说00后躺平了,但是有一说一,该牛的还是牛。 这不,前段时间公司来了个00后,工作都没两年,跳槽起薪18K。本来还以为是个年少有为的技术大牛呢,结果相处一个月下来发现技术也就那样。 问起他是如何做到和老…

操作技巧 | Revit中如何新建系统类型并赋予颜色?

大家好,这里是行走的安利机---建模助手。 新建系统后,把材质赋予系统,以做出不同颜色的管道和风管系统,那么:Revit中如何新建系统类型并赋予颜色呢? 下面小编说下解决方案。 REVIT 具体解决办法如下 正…

每日做题总结——day01

目录 选择题 for循环 指针数组 位段 getchar 大小端存储 进制与格式控制符 位运算 数组指针 二维数组的存储 计算二进制中1的个数 斐波那契数列求递归次数 编程题 删除公共字符 排序子序列 倒置字符串 选择题 for循环 解析:该题主要看for…

【Java实战篇】Day6.在线教育网课平台

文章目录一、需求:绑定媒资1、需求分析2、库表设计与模型类3、接口定义4、Mapper层开发5、Service层开发6、完善controller层二、需求:课程预览1、需求分析2、实现技术3、模板引擎4、Freemarker入门5、部署网站门户6、接口定义7、接口开发8、编写模板9、…

chrome中debugger调试定位不准确

问题:代码中添加了debugger代码进行调试,但总是定位不到标注了debugger的位置 代码中debugger在33行浏览器调试定位到了78行 准确定位方法:

CASE WHEN函数语句多条件下使用详解

目录 CASE 的两种格式: 简单CASE函数 和 CASE搜索函数 同时配合 SUM 以及 COUNT 方法的使用 ① SUM函数 ② COUNT函数 CASE WHEN函数语句,实现简单CASE函数和CASE搜索函数两种格式。同时配合 SUM以及COUNT方法的使用 CASE 的两种格式: 简…

请问网络安全员,渗透师,和黑客三者是什么关系?

举个例子 黑客其实就是想偷偷进一个房子的小偷 程序员就是建这个房子的建筑工人 网络安全员就是维护这个房子的物业人员 渗透师就是检查房子【有没有能偷偷进入的窗口,能被撬动的锁,能破解的密码门】的人 有人问为什么那么多网安盯着还能让黑客进入…

深入了解jvm垃圾回收

1、为什么要有GC,哪些内存对象需要回收? 对于一个Java开发者来说,了解过Java内存区域的都知道,Java内存区域分了堆、栈、程序计数器等等。 Java的程序计数器,栈内存 ,他们随线程生,随线程灭&a…

Alibaba开源的Java诊断工具Arthas-实战

目录参考一、启动二、支持的ognl表达式三、监听参数监听Controller 的参数和返回值监听完整参数和返回值监听kafka消费监听单个参数监听异常按照耗时进行过滤监听参数比较四、变量和方法查询静态成员变量值查询配置类具体属性的值通过类加载器查看Spring容器中对象所有属性执行…

[ 应急响应基础篇 ] 解决远程登录权限不足的问题(后门账号添加远程桌面权限)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…
最新文章