最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

全球快播: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 docxfile=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 sysfrom docx import Documentfrom docx.shared import Inchesdef 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 docxdoc = 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的写的方式可以参考官方文档的介绍

关键词: 一般来说