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。

也真是奇了怪了,怎么安装和导入模块时,很多都不用一个名字,看来是很有必要出一个python版本的模块管理程序python-maven了,本段纯属PS。

四.读取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中可以处理word文档的模块:docx模块 - Python技术站

(0)
上一篇 2023年3月31日
下一篇 2023年3月31日

相关文章

  • Python中5大模块的使用教程(collections模块、time时间模块、random模块、os模块、sys模块)

    1. 模块的简单认识 定义: 模块就是我们把装有特定功能的代码进行归类的结果. 从代码编写的单位来看我们的程序,从小到大的顺序: 一条代码 < 语句块 < 代码块(函数,类) < 模块.我们⽬目前写的所有的py文件都是模块.引入模块的方式: import 模块 from xxx import 模块 2. collections模块 coll…

    Python开发 2023年4月2日
    00
  • python进程池中的回调函数

    什么是回调函数 指定一个任务后、并且指定一个回调函数后,当指定的进程池执行的任务结束后,会将该任务的返回值作为回调函数的参数传递到回调函数中,并且回调函数得以执行 回调函数在主进程中被执行 import os from multiprocessing import Pool def func1(n): print(‘in func1’, os.getpid(…

    python 2023年4月17日
    00
  • Python3教程:多线程的使用教程

    一、简介 Python中使用线程有两种方式:函数或者用类来包装线程对象。 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程。语法如下: 参数说明: function – 线程函数。 args – 传递给线程函数的参数,他必须是个tuple类型。 kwargs – 可选参数。 实例: import _thread im…

    Python开发 2023年4月2日
    00
  • Python教程:OS与sys模块用法教程

    一、Python os模块 包含普遍的操作系统功能,如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的。 1、os.access() 查看文件是否有指定权限,有则返回True否则返回flase os.access(path, mode) path:指定文件路径 mode:参数有F_OK(是否存在),R_OK(可读),W_OK(可写),X_OK(可执行…

    Python开发 2023年3月31日
    00
  • Python函数与码复用

    一.函数的定义与使用 1.函数的定义与使用方法 函数是一段代码的表示,它对应了一段具有特定功能的、可重用的语句组,它是一种功能的抽象,它表达特定的含义。在一般编程中,函数有两个作用,它通过函数定义一段功能,可以降低编码难度,同时也可以对一段代码进行复用。 函数的使用方法如下,其中函数体指的是函数内部包含的一些语句代码: def <函数名>(&lt…

    python 2023年4月22日
    00
  • python教程:一个 list 使用 for 遍历,边循环边删除的问题

    今天由于要对一个 list 数据类型写一个循环删除的程序(这是小编第一次对于 list 操作),但发现一个奇异问题,来,我们来看看代码跟效果: # 初始化一个 list 列表,为了下边的方便比较,我就使用跟 list 索引来做 list 的元素 datas = [0,1,2,3,4] # 打印元素组,方便比较 print(datas) #使用 for 遍历 …

    Python开发 2023年4月2日
    00
  • Python中的异常处理总结

    1.异常分类 错误Error: 原因 示例 笔误 像变量名写错,造成的语法错误 逻辑错误 算法写错了,例如原本逻辑是求和,但写成了乘积 函数或者类使用错误 这类也归为逻辑错误 写代码时,错误是可以避免的。 异常Exception 有时候程序写的没有问题,也没有语法错误,但在某些情况下依然出现一些意外,导致程序无法正常执行,就是通常所说的异常。 例如open函…

    Python开发 2023年3月31日
    00
  • python中5个带key的内置函数

    1.max取最大值函数 max() 方法返回给定参数的最大值,参数可以为序列。 lis = [1,2,3,-4] print(max(lis)) #返回lis列表中的最大值 ”’结果: 3 ”’ print(max(lis,key=abs)) #key参数指向绝对值函数,返回的结果是-4 2.min取最小值函数 min() 方法返回给定参数的最小值,参数…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部