● 研二在读学生,非工科非计算机专业,故代码简陋初级勿喷,本文仅为记录和快乐分享。
○ 感谢肯定,感谢点赞收藏分享,转载请注明本页出处即可。 ____Ⓙ即刻@王昭没有君
本文仅为笔者摸索总结-欢迎订正补充交流讨论-
❤python识别ppt文件格式 ——(专栏:基于python编写简单office阅卷程序③)
————————
一、整体思路:
🍒1. 使用python第三方库pptx识别尽可能多的excel格式;(更简单方便)
- 使用 dir() 查看当级存在的属性或下级对象(不含双下划线__的)
- 使用 (.属性)试图调用查看属性,或(.对象)进入下级对象
🍒2. 将.pptx转为.xml格式文件,读取标签,补充识别pptx库无法识别的格式;
- 解压ppt.pptx文件为xml文件(不止一个,有好几个文件夹)
- 找到相应的属性在xml文件中的存储标签名和层级
- 使用(层级.tag)(层级.attrib)(层级.text) 试图取出该属性
🍒3. office有个懒惰且简洁的规则是,很多默认属性和格式,若该文档中作者未修改默认格式或属性,则在xml文件中该属性或格式的标签不存在 ,则在用python抽取该格式或属性时,返回值为None或空,有时还会提示不存在而报错。例如:
- 默认字体为等线(有的版本是宋体)
- 默认字号28磅(也可能因版本不同而差异)
- 默认无主题背景等
而在修改了这些格式后,该属性标签会存储在.pptx和.xml文件中。又不像是完全的日志文件。
————————
二、使用python库情况
此处均为笔者编写阅卷程序用到的,若只识别ppt格式,并不需要以下全部:
import xlrd # 读取excel文件,主要是获取名单和创建地址用
import openpyxl # 登成绩进excel用
import os # 使用文件路径等
import xml.etree.ElementTree as ET # 读取xml文件
import pptx # 读取ppt文件
除此之外,在解压转为xml文件时还用到以下库:
import os # 因笔者分开写的解压程序,解压也用到os库
import xlrd # 因笔者分开写的解压程序,解压也用到xlrd库,主要是获取名单和创建地址用
import shutil # 删除配置文件
import zipfile
# 解压word(.docx)、excel(.xlsx)、ppt(.pptx)文件成为.xml格式文件
————————
三、openpyxl库识别表格文件结构:
- [ ]pptx:
- [ ]slides[序号]:
- shapes[序号]:
- text_frame:
- paragraphs[序号]
- runs[序号]
- paragraphs[序号]
- charts
- tables
- text_frame:
- shapes[序号]:
- [ ]slides[序号]:
🍍1.读取ppt文件:pptx.Presentation ( ’ 文件地址 ’ )
ppt_file = pptx.Presentation(r"F:\测试\ppt.pptx")
(1)使用 dir(ppt_file) 查看当级存在的属性或下级对象(不含双下划线__的);
🍍2.读取幻灯片:ppt_file.slides[序号]
ppt_1 = ppt_file.slides[0] # 第一张幻灯片
(1)使用 dir(ppt_1) 查看当级存在的属性或下级对象(不含双下划线__的);
(2)有关幻灯片的属性基本都在slides部分里;
(3)slides部分属性包括但不仅限于:
- 幻灯片总张数 :len(self.pptx.slides) #后不加[序号]
- 幻灯片版式 :ppt_1.slide_layout.name
- 幻灯片中形状:ppt_1.shapes[序号]
- 母版属性貌似是ppt_1.slide_layout.name? 没调出来
🍍3.读取形状内容:ppt_1.shapes[序号]
shape_1 = ppt_1.shapes[0] # 第一个形状
(1)使用 dir(shape_1) 查看当级存在的属性或下级对象(不含双下划线__的);
(2)shapes部分属性包括但不仅限于:
- 形状类型 :shape_1.shape_type #
————①如果shape_1是一个文本框、艺术字等纯文字形状:
- 形状全部文字内容 :shape_1.text_frame.text # 此处 .text_frame 可省略
- 段落文字内容 :shape_1.text_frame.paragraphs[序号].text
- 段落文字对齐方式 :shape_1.text_frame.paragraphs[序号].text.alignment
- 段落段前间距 :shape_1.text_frame.paragraphs[序号].text.alignment.space_before
- 段落段后间距 :shape_1.text_frame.paragraphs[序号].text.alignment.space_after
- 段落文字字体:shape_1.text_frame.paragraphs[序号].font.name
- 段落文字字号:shape_1.text_frame.paragraphs[序号].font.size
- 段落文字加粗:shape_1.text_frame.paragraphs[序号].font.bold # 布尔型
————②如果shape_1是一个图表形状:
- 图表标题 :shape_1.name
- 图表宽度 :shape_1.width
- 图表高度 :shape_1.height
- 图标系列总数量 :len(shape_1.chart.series)
- 图表系列数据值 :shape_1.chart.series[序号].values
- 图表系列名 :shape_1.chart.series[序号].name
- 图表标记点大小 :shape_1.chart.series[序号].marker.size
- 图表标记点类型 :shape_1.chart.series[序号].marker.style
- 图表系列数据值 :shape_1.chart.series[序号].values
————②如果shape_1是一个表格形状:
- 表格行数 :len(shape_1.table.rows)
- 表格列数 :len(shape_1.table.columns)
- 表格行高 :shape_1.table.rows[序号].height
- 表格列宽 :shape_1.table.columns[序号].width
- 表格内容 :shape_1.table.cell(行,列).text
- 表格填充类型 :shape_1.table.cell(0,0).fill.type
- 表格主题色 :shape_1.table.cell(0,0).fill.theme_color
- 表格前景色 :shape_1.table.cell(0,0).fill.fore_color
pptx库里能识别到的格式并不完整,本文有提到可识别的部分格式,其余多数还是只能通过读取xml文件调取。虽然xml文件可以识别到全部格式,但使用pptx库读取更加简便,所以能不用xml就尽量不用。
然而库功能并不完全,此时需要读取.pptx文件转成的.xml文件,识别其中格式。其中最常用的格式是幻灯片切换方式。本文以识别切换方式为例。
————————
四、读取xml文件识别文档结构:
🍋1.文件转换
(1)最直接的方法:手工将ppt.pptx文件重命名为ppt.zip文件,再解压缩。
①原文件
②是
③解压到当前文件夹,或你选择的地方
④我们需要使用到的xml文件都在解压后的ppt文件夹里
⑤根据文件的不同,里面的xml文件数量和内容均有差异。例如笔者这个文档有图表,故该文件夹下才有charts文件夹及里面的文件。若无图表且无修改图表历史记录,则该文件夹下不含charts文件夹及里面的文件。用记事本可以简单地打开查看内容。
(2)使用代码批量转换。在CSDN上有很多代码分享,可自行查阅ppt转xml文件等关键字。此处贴笔者使用的代码,尴尬的是笔者找不到原出处了,若原作者看见本文请联系笔者填写出处或删除本部分,非常抱歉。
- 因笔者将试卷文件夹设置为学生学号,每个学号的文件夹里有三个需要读取的文件,故先读取名单中学号,以学号作为试卷地址路径的一部分,批量每个学号解压文件夹里的三个文件。
import os
import zipfile
import shutil
import xlrd
class Name_list():
def __init__(self, file_address):
self.file_address = file_address
pass
def read(self, sheet_name):
workbook = xlrd.open_workbook(self.file_address)</