Python使用docx模块处理word文档流程详解
作者:魔王不会哭 发布时间:2023-03-08 15:45:06
一.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的写的方式可以参考官方文档的介绍
来源:https://blog.csdn.net/python56123/article/details/130029502
猜你喜欢
- ORM模型:ORM模型对于后端开发来说肯定是不陌生的,包括很多后端框架比如django,现在都自带这个模型了ORM(Object Relat
- 1.0 为什么要做这个博客站?在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满
- 本文介绍基于Python语言,将一个Excel表格文件中的数据导入到Python中,并将其通过字典格式来存储的方法~ &a
- 目录1、概述2、__new__ 和 __init__ 的区别3、应用1:改变内置的不可变类型4、应用2:实现一个单例5、应用3:客户端缓存6
- 代码如下:Create trigger tri_wk_CSVHead_History on wk_CSVHead_History --声明
- 大家可以先参考官方演示文档:效果图:'''==============3D scatterplot=========
- format()函数"""测试 format()函数"""def t
- 1.GO中包的定义与介绍go中包分为三种:1.系统内置包 2. 自定义包 3.第三方包2. 包管理工具 go mod2.1 自定义包 (可以
- 之前写页面的时候有试过想用js获取某些元素的translate的数值什么的,但是translate又是transform的子样式(勉强说说)
- 本文实例为大家分享了js秒表计时器的制作代码,供大家参考,具体内容如下具体代码:<!DOCTYPE html><html
- 由于本人使用的是Android设备做自动化测试,所以以下内容均基于Android系统做出的整理一、启动app启动app需要设置Capabil
- 本文实例为大家分享了python多线程分块读取文件的具体代码,供大家参考,具体内容如下# _*_coding:utf-8_*_import
- Javascript刷新页面的几种方法: 1. history.go(0) 2. location.reload() 3. location
- Q:在给Dataloader设置worker数量(num_worker)时,到底设置多少合适?这个worker到底怎么工作的?
- 前言CAPTCHA全称Completely Automated Public Turing Test to Tell Computers a
- 一个不错的js效果,实现了图片预加载,并实时显示图片加载进度。<script> var l=0; var i
- 一般情况下,导出超时可能都是以下三种情况:一、sql语句复杂,查询时间过长;二、处理查询后数据逻辑冗余;三、数据量过大导致响应超时。接下来分
- 但是怎么找到是哪个SQL语句的执行时间过长呢?可以通过MySQL Slow Log来找,详解如下。 首先找到MySQL的配置文件my.cnf
- 本文实例讲述了Python切片工具pillow用法。分享给大家供大家参考,具体如下:切片:使用切片将源图像分成许多的功能区域因为要对图片进行
- 随着ES6规范的到来,Js中定义变量的方法已经由单一的 var 方式发展到了 var、let、const 三种之多。var 众所周知,可那俩