● 研二在读学生,非工科非计算机专业,故代码简陋初级勿喷,本文仅为记录和快乐分享。
○ 感谢肯定,感谢点赞收藏分享,转载请注明本页出处即可。 ____Ⓙ即刻@王昭没有君
本文仅为笔者摸索总结-欢迎订正补充交流讨论-
❤python识别word文件格式 ——(专栏:基于python编写简单office阅卷程序①)
————————
一、整体思路:
🍒1. 使用python第三方库docx识别尽可能多的word格式;(更简单方便)
- 使用 dir() 查看当级存在的属性或下级对象(不含双下划线__的)
- 使用 (.属性)试图调用查看属性,或(.对象)进入下级对象
🍒2. 将.docx转为.xml格式文件,读取标签,补充识别docx库无法识别的格式;
- 解压word.docx文件为xml文件(不止一个,有好几个文件夹)
- 找到相应的属性在xml文件中的存储标签名和层级
- 使用(层级.tag)(层级.attrib)(层级.text) 试图取出该属性
🍒3. office有个懒惰且简洁的规则是,很多默认属性和格式,若该文档中作者未修改默认格式或属性,则在xml文件中该属性或格式的标签不存在 ,则在用python抽取该格式或属性时,返回值为None或不存在,有时还会报错。例如:
- 默认字体为宋体(有的版本是宋体(标题)或宋体(正文))
- 默认字号小三(也可能因版本不同而不同或.doc和.docx差异)
- 默认无首行缩进、默认行间距1.0倍等
而在修改了这些格式后,该属性标签会存储在.docx和.xml文件中。又不像是完全的日志文件。
————————
二、使用python库情况
此处均为编写阅卷程序用到的,若只识别word格式,并不需要以下全部:
import docx # 读取word文件
import xlrd # 读取excel文件,主要是获取名单和创建地址用
import openpyxl # 读取/写入 excel文件,主要是记录成绩用
import os # 使用文件路径等
import xml.etree.ElementTree as ET # 读取xml文件
除此之外,在解压转为xml文件时还用到以下库:
import os # 因笔者分开写的解压程序,解压也用到os库
import xlrd # 因笔者分开写的解压程序,解压也用到xlrd库,主要是获取名单和创建地址用
import shutil # 删除配置文件
import zipfile
# 解压word(.docx)、excel(.xlsx)、ppt(.pptx)文件成为.xml格式文件
————————
三、docx库识别文档结构:
-
document:
- sections:
- parapraphs:
- runs:
-
sections和paragraphs是同级关系
-
表格和图片游离于sections和paragraphs
例如 :
🍍1.读取文件:docx.Document ( ’ 文件地址 ’ )
file = docx.Document(r"F:\文件地址\word.docx")
🍍2.读取节们:文件.sections
sections = file.sections # 节们
for section in sections: # 遍历节
print(section.page_height) # 页高
(1)分节符是分割节与节的标志(未尝试过分页符,欢迎补充);
(2)有关页面的属性基本都在sections部分里;
(3)节属性包括但不仅限于: # 使用print(dir(section)) 、print(dir(sections))查看更多属性和下级对象
- 页高 :section.page_height
- 页宽 :section.page_width
- 页面横纵 :section.orientation
- 装订线 :section.gutter
- 左边距 :section.left_margin
- 右边距 :section.right_margin
- 上边距 :section.top_margin
- 下边距 :section.bottom_margin
- 页眉:section.header
- 页脚 :section.footer
✨——其中页眉: # 使用print(dir(section.header)) 查看更多属性和下级对象
- 页眉顶端距离 :section.header_distance
- 页脚底端距离 :section.footer_distance
- 页眉内容 :section.header.paragraphs[0].text
- 页眉对齐 :section.header.paragraphs[0].alignment
- 页眉字号:section.header.paragraphs[0].runs[0].font.size
- 页眉字体:section.header.paragraphs[0].runs[0].font.name
✨——页脚类似,但页码只能从xml文件识别。
🍍3.读取段落们:文件.paragraphs
paragraphs = file.paragraphs # 段落们
for i in range(len(paragraphs)): # 遍历段落 也可以写成上面节的遍历形式,此处须为后续保留段号i,故写成这种形式。
paragraph = paragraphs[i]
if paragraphs[i].text != "": # 筛选非空段
print<