现如今,随着计算机的逐渐普及。现代化办公成为每个职场人必备的技能,本文档就来介绍,如何使用pytohn实现自动化办公。然而,自动化办公有时并不能减少工作量。自动化办公更适合批量处理文档。单一的文件,小金不建议使用。这篇文档我们主要即介绍python操作word,pdf,ppt,以及压缩包。
一、python操作word
(一) 介绍
python操作word,我们主要是用的是python-docx库。
官方文档: python-docx — python-docx 1.1.2 documentation
为了使用python-docx我们需要安装。安装命令:pip install python-docx
(二) 使用例子
from docx import Document
from docx.shared import Inches
document = Document()
document.add_heading('Document Title', 0)
p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True
document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='Intense Quote')
document.add_paragraph(
'first item in unordered list', style='List Bullet'
)
document.add_paragraph(
'first item in ordered list', style='List Number'
)
document.add_picture('monty-truth.png', width=Inches(1.25))
records = (
(3, '101', 'Spam'),
(7, '422', 'Eggs'),
(4, '631', 'Spam, spam, eggs, and spam')
)
table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for qty, id, desc in records:
row_cells = table.add_row().cells
row_cells[0].text = str(qty)
row_cells[1].text = id
row_cells[2].text = desc
document.add_page_break()
document.save('demo.docx')
效果
(三) 使用python-docx新建word文档
1. 创建文档
使用python-docx模块中Document对象来创建一个word文档
from docx import Document
document = Document()
这将打开一个基于默认“模板”的空白文档,这与您使用内置默认值在 Word 中启动新文档时所得到的差不多。您可以使用 python-docx 打开并处理现有的 Word 文档,但我们暂时保持简单。
2. 保存文档
当我们创建好word文档后,增加好了合适内容,我们可以调用document模块的save方法来保存word文件
save方法语法格式如下
def save(self, path_or_stream: str | IO[bytes]):
"""Save this document to `path_or_stream`.
`path_or_stream` can be either a path to a filesystem location (a string) or a
file-like object.
"""
self._part.save(path_or_stream)
那我们创建好document对象后是不会自动保存我们word文件,需要手动调动save方法保存。
3. 增加段落
段落是word文档基础,他们可以用于正文,标题,列表等。
为了创建一个段落,我们使用Document对象的add_paragraph方法。
其语法格式如下:
def add_paragraph(self, text: str = "", style: str | ParagraphStyle | None = None) -> Paragraph:
"""Return paragraph newly added to the end of the document.
The paragraph is populated with `text` and having paragraph style `style`.
`text` can contain tab (``\\t``) characters, which are converted to the
appropriate XML form for a tab. `text` can also include newline (``\\n``) or
carriage return (``\\r``) characters, each of which is converted to a line
break.
"""
return self._body.add_paragraph(text, style)
该方法会返回段落对象,即在文档末尾返回一个段落。
使用实例:
from docx import Document
document = Document()
document.add_paragraph('我是一个段落')
document.save('demo.docx')
该方法会在文档末尾追加一个段落,段落文字为“我是一个段落”
此外,还可以使用Paragraph对象的insert_paragraph_before方法来在指定位置增加一个段落。其语法如下:
def insert_paragraph_before(
self, text: str | None = None, style: str | ParagraphStyle | None = None
) -> Paragraph:
"""Return a newly created paragraph, inserted directly before this paragraph.
If `text` is supplied, the new paragraph contains that text in a single run. If
`style` is provided, that style is assigned to the new paragraph.
"""
paragraph = self._insert_paragraph_before()
if text:
paragraph.add_run(text)
if style is not None:
paragraph.style = style
return paragraph
使用例子
from docx import Document
document = Document()
par = document.add_paragraph('我是一个段落')
par.insert_paragraph_before('我是段落2')
document.save('demo.docx')
4. 增加标题
使用Document对象的add_heading标题可以用来增加标题,在增加标题时,要制定标题内容和标题级别。
def add_heading(self, text: str = "", level: int = 1):
"""Return a heading paragraph newly added to the end of the document.
The heading paragraph will contain `text` and have its paragraph style
determined by `level`. If `level` is 0, the style is set to `Title`. If `level`
is 1 (or omitted), `Heading 1` is used. Otherwise the style is set to `Heading
{level}`. Raises |ValueError| if `level` is outside the range 0-9.
"""
if not 0 <= level <= 9:
raise ValueError("level must be in range 0-9, got %d" % level)
style = "Title" if level == 0 else "Heading %d" % level
return self.add_paragraph(text, style)
在设置标题级别时,如果设置标题级别为0,则视为追加一个段落标题,即可以理解成文档标题。标题可以取值是0-9;
使用实例
from docx import Document
document = Document()
document.add_heading("我是标题0", level=0)
document.add_heading("我是标题1", level=1)
document.add_heading("我是标题3", level=3)
document.add_heading("我是标题5", level=5)
document.add_heading("我是标题7", level=7)
document.add_heading("我是标题9", level=9)
document.save('demo.docx')
5. 添加分页符
如果我们想设置内容分页显示,我们可以使用分页符。在docx模块中,使用Document对象的add_page_break方法增加分页符。
源码:
def add_page_break(self):
"""Return newly |Paragraph| object containing only a page break."""
paragraph = self.add_paragraph()
paragraph.add_run().add_break(WD_BREAK.PAGE)
return paragraph
使用示例
from docx import Document
document = Document()
document.add_paragraph("Hello World")
document.add_page_break()
document.add_paragraph("Hello China")
document.save('demo.docx')
该示例代码会在word文档第一页生成一个段落,显示文字Hello,world。第二页显示Hello China.
6. 添加表格
表格是一种简便展示信息的方法。在docx模块中使用Document模块的add_table方法创建一个表格,在创建表格时制定行和列。
def add_table(self, rows: int, cols: int, style: str | _TableStyle | None = None):
"""Add a table having row and column counts of `rows` and `cols` respectively.
`style` may be a table style object or a table style name. If `style` is |None|,
the table inherits the default table style of the document.
"""
table = self._body.add_table(rows, cols, self._block_width)
table.style = style
return table
- rows: 行
- cols: 列
为了访问表格内容,我们可以直接访问表格单元格。我们使用table对象或者row对象的cell方法来制定单元格。表对象,以及表的行列对象是可迭代对象,可以通过索引进行访问,也可以用for进行遍历。
获取单元格的两种方法
from docx import Document
document = Document()
table = document.add_table(rows=2, cols=2)
cell = table.cell(0, 1) # 一行二列的单元格
row = table.row(0) # 获取第一行
cell2 = row.cell[1] # 获取第一行的第二列
document.save('demo.docx')
为了给单元格增加文字,可以使用cell方法的text变量进行设置
from docx import Document
document = Document()
table = document.add_table(rows=2, cols=2)
cell = table.cell(0, 1) # 一行二列的单元格
row = table.rows[0] # 获取第一行
cell2 = row.cells[0] # 获取第一行的第1列
cell.text = '我是单元格1'
cell2.text = '我是单元格2'
document.save('demo.docx')
如过定义好了表格后,我们发现行不够用了。也可以使用add_rows来增加行。
下面是一个完整表格的案例
from docx import Document
# Create a new document
document = Document()
# Define the items to add to the table
items = (
(7, '1024', 'Plush kittens'),
(3, '2042', 'Furbees'),
(1, '1288', 'French Poodle Collars, Deluxe'),
)
# Add a table to the document
table = document.add_table(rows=1, cols=3)
# Populate the header row
heading_cells = table.rows[0].cells
heading_cells[0].text = 'Qty'
heading_cells[1].text = 'SKU'
heading_cells[2].text = 'Description'
# Add a data row for each item
for item in items:
cells = table.add_row().cells
cells[0].text = str(item[0]) # Access quantity using index
cells[1].text = item[1] # Access SKU using index
cells[2].text = item[2] # Access description using index
# Save the document
document.save('example.docx')
此外,还可以给表格设置一个样式,使用table对象的style属性就可以设置样式
样式名称由表格样式名称中的所有空格删除而成。您可以将鼠标悬停在 Word 表格样式库中的缩略图上来查找表格样式名称。
table.style = 'LightShading-Accent1'
7. 增加图片
在word中,可以使用插入--图片的形式插入图片,在docx模块中使用Document对象picture方法也可以增加图片。如果需要指定图片大小,只需要指定width,height参数即可
from docx import Document
from docx.shared import Inches
doc = Document()
doc.add_heading('图片', level=1)
doc.add_picture('./temp.jpeg', width=Inches(2))
doc.save('test.docx')
如果想设置图片宽度和页面宽度一致可以通过Doc.sections[0].page_width来获取页面宽度
8. 应用段落样式
在增加段落时可以指定style参数,来指定段落的样式.
from docx import Document
from docx.shared import Inches
doc = Document()
doc.add_heading('增加段落样式', level=1)
doc.add_paragraph('Lorem ipsum dolor sit amet.', style='ListBullet')
doc.save('test.docx')
此外,还可以通过paragraph对象的style属性来增加段落样式
9. 应用粗体和黑体
- 段落包含所有块级格式,如缩进、行高、制表符等。
- 字符级格式(如粗体和斜体)应用于运行级别。段落内的所有内容都必须在运行内,但可以有多个运行。因此,中间有一个粗体单词的段落需要三个运行,一个普通运行,一个包含单词的粗体运行,以及另一个用于后面文本的普通运行。
当通过向 .add_paragraph() 方法提供文本来添加段落时,它将被放入单个运行中。 可以在段落上使用 .add_run() 方法添加更多内容:
paragraph = document.add_paragraph('Lorem ipsum ')
paragraph.add_run('dolor sit amet.')
run对象同时具有.bold和.italic
属性,允许设置值。
paragraph = document.add_paragraph('Lorem ipsum ')
run = paragraph.add_run('dolor')
run.bold = True
paragraph.add_run(' sit amet.')
如果不需要其他东西,也可以直接在add_run的结果上设置
paragraph.add_run('dolor').bold = True
# is equivalent to:
run = paragraph.add_run('dolor')
run.bold = True
# except you don't have a reference to `run` afterward
创建段落时也可以在app_run只传入指定元素,而不是在app_paragraph中传入文本,这样能使代码看起来更简单
paragraph = document.add_paragraph()
paragraph.add_run('Lorem ipsum ')
paragraph.add_run('dolor').bold = True
paragraph.add_run(' sit amet.')
其他段落样式:
10. 设置字符样式
设置字符样式有两种办法,一种是直接在add_run方法中指定style参数。另外是调用Run对象的style属性来设置。
paragraph = document.add_paragraph('Normal text, ')
paragraph.add_run('text with emphasis.', 'Emphasis')
paragraph = document.add_paragraph('Normal text, ')
run = paragraph.add_run('text with emphasis.')
run.style = 'Emphasis'
此外。docx模块还提供了其他方法来修改字体样式。
(四) python读取word
Document对象除了可以新建word文档外,也可以读取现有word文档。
1. 读取word数据
在调用Document发法时可以传递已经存在的word文件,以此来读取word文件
from docx import Document
doc = Document('./demo.docx')
2. 获取段落数据
使用Document对象的paragh方法可以获取到段落对象。返回值是一个列表
paragraph = doc.paragraphs
for para in paragraph:
print(para.text)
3. 读取表格
通过Document的table对象可以获取到表格数据
tables = doc.tables
for table in tables:
for row in table.rows:
for cell in row.cells:
print(cell.text)
二、python 操作PPT
python操作PPT使用的是python-pptx库。
(一) 介绍
- 介绍
-
- python-pptx 是一个用于创建、读取和更新 PowerPoint (.pptx) 文件的 Python 库。
- 典型用途是从动态内容(例如数据库查询、分析输出或 JSON 有效负载)生成 PowerPoint 演示文稿,可能是响应 HTTP 请求并下载生成的 PPTX 文件作为响应。它可以在任何支持 Python 的平台上运行,包括 macOS 和 Linux,并且不需要安装或许可 PowerPoint 应用程序。
- 它还可用于分析语料库中的 PowerPoint 文件,也许可以提取搜索索引文本和图像。
- 还可以用于简单地自动化制作一两张幻灯片,而手动制作会很乏味,这就是这一切的开始。
- 更多信息可参见 python-pptx 文档。: python-pptx — python-pptx 1.0.0 documentation
- 安装: pip install python-pptx
- 依赖:pillow lxml xlsxwriter
(二) 简单例子
from pptx import Presentation
prs = Presentation()
title_slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(title_slide_layout)
title = slide.shapes.title
subtitle = slide.placeholders[1]
title.text = "Hello, World!"
subtitle.text = "python-pptx was here!"
prs.save('test.pptx')
(三) 基本使用
1. 新建ppt文件与保存ppt文件
在pptx库中,使用Persentation对象创建PPT文件
函数名与属性,类 |
含义 |
pptx.Persentation() |
创建PPT文件对象 |
ppt.slide_layouts[num] |
选择PPT页面布局 |
ppt.slides.add_slide() |
增加PPT页面 |
presentation.save(path) |
保存文件 |
from pptx import Presentation
prs = Presentation()
title_slide = prs.slide_layouts[0] # 设置第一个页面
slide = prs.slides.add_slide(title_slide) # 增加新的页面,页面为标题页面
title = slide.shapes.title # 设置标题
title.text = 'Title'
prs.save("Title.pptx")
以上的例子,我们展示了如何新建一个ppt文件,并新增页面为标题页面,最后保存这个PPT。
我们使用pptx新建ppt文件的思路就是:创建PPT对象,获取页面,设置页面布局,增加内容,保存PPT。
我们通过调用pptx库的Presentation()对象,创建一个PPT对象。创建PPT对象后,需要获取PPT页面,即通过Presentation对象的slide_layouts获取页面对象。然后使用add_slide方法新增页面布局。最后调用slide对象的shape属性可以增加内容。
如果我们需要保存PPT文件,我们使用Presentation()对象的save方法即可。
2. 增加内容
在使用pptx模块时,可以使用Presentation方法对象的slide属性获取内容框。
函数名&属性&类 |
含义 |
slide.shapes |
获取内容框 |
slide.shapes.title |
获取内容框标题对象 |
slide.shapes.title.text |
获取/设置内容框标题值 |
slide.shapes.placeholders[num] |
获取第num个内容框 |
slide.placeholder.text |
获取/设置段落内容 |
slide.placeholder.text.frame.add_paragraph |
增加一个段落 |
slide.shapes.add_textbox() |
增加一个内容文本域 |
from pptx import Presentation
# 创建一个Presentation对象
prs = Presentation()
# 添加一个幻灯片,使用的是默认的布局(通常是带有标题和内容的布局)
slide = prs.slides.add_slide(prs.slide_layouts[1])
# 获取标题对象并设置其文本
title = slide.shapes.title
title.text = "这是标题"
# 获取内容框
content_box = slide.shapes.placeholders[1] # placeholders[1] 通常是内容占位符
# 设置内容框的文本
content_box.text = "这是第一段内容"
# 添加一个新的段落到内容框中
new_paragraph = content_box.text_frame.add_paragraph()
new_paragraph.text = "这是新添加的第二段内容"
# 保存演示文稿
prs.save('example.pptx')
接下来,可以用pargraph属性设置段落内容。
paragraph.text |
获取/设置段落内容 |
paragraph.level |
获取/设置段落登记 |
paragraph.font.bold |
设置段落字体 |
paragrap.font.size |
设置段落字体大小。 |
from pptx import Presentation
from pptx.util import Pt # 用于字体大小
# 创建一个Presentation对象
prs = Presentation()
# 添加一个幻灯片,使用的是默认的布局(通常是带有标题和内容的布局)
slide = prs.slides.add_slide(prs.slide_layouts[1])
# 获取标题对象并设置其文本
title = slide.shapes.title
title.text = "这是标题"
# 获取内容框
content_box = slide.shapes.placeholders[1] # placeholders[1] 通常是内容占位符
# 设置内容框的文本
content_box.text = "这是第一段内容"
# 添加一个新的段落到内容框中
new_paragraph = content_box.text_frame.add_paragraph()
new_paragraph.text = "这是新添加的第二段内容"
# 设置段落级别(缩进层级)
new_paragraph.level = 1
# 设置字体加粗
new_paragraph.font.bold = True
# 设置字体大小
new_paragraph.font.size = Pt(24) # 24磅大小
# 保存演示文稿
prs.save('example.pptx')
3. 增加图片
使用shape对象的add_picture()增加图片
from pptx import Presentation
from pptx.util import Inches
img_path = 'temp.jpeg'
prs = Presentation()
blank_slide_layout = prs.slide_layouts[6]
slide = prs.slides.add_slide(blank_slide_layout)
left = top = Inches(1)
pic = slide.shapes.add_picture(img_path, left, top)
left = Inches(5)
height = Inches(5.5)
pic = slide.shapes.add_picture(img_path, left, top, height=height)
prs.save('test.pptx')
4. 增加流程图
使用shape对象的add_shape方法增加流程图。
from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE
from pptx.util import Inches
prs = Presentation()
title_only_slide_layout = prs.slide_layouts[5]
slide = prs.slides.add_slide(title_only_slide_layout)
shapes = slide.shapes
shapes.title.text = 'Adding an AutoShape'
left = Inches(0.93) # 0.93" centers this overall set of shapes
top = Inches(3.0)
width = Inches(1.75)
height = Inches(1.0)
shape = shapes.add_shape(MSO_SHAPE.PENTAGON, left, top, width, height)
shape.text = 'Step 1'
left = left + width - Inches(0.4)
width = Inches(2.0) # chevrons need more width for visual balance
for n in range(2, 6):
shape = shapes.add_shape(MSO_SHAPE.CHEVRON, left, top, width, height)
shape.text = 'Step %d' % n
left = left + width - Inches(0.4)
prs.save('test.pptx')
5. 增加表格
使用shape对象的add_table()方法来增加表格。
from pptx import Presentation
from pptx.util import Inches
prs = Presentation()
title_only_slide_layout = prs.slide_layouts[5]
slide = prs.slides.add_slide(title_only_slide_layout)
shapes = slide.shapes
shapes.title.text = 'Adding a Table'
rows = cols = 2
left = top = Inches(2.0)
width = Inches(6.0)
height = Inches(0.8)
table = shapes.add_table(rows, cols, left, top, width, height).table
# set column widths
table.columns[0].width = Inches(2.0)
table.columns[1].width = Inches(4.0)
# write column headings
table.cell(0, 0).text = 'Foo'
table.cell(0, 1).text = 'Bar'
# write body cells
table.cell(1, 0).text = 'Baz'
table.cell(1, 1).text = 'Qux'
prs.save('test.pptx')
6. 增加图表
使用pptx的chart对象可以用来封装图表信息。使用shape对象的add_picture方法来增加图表
函数名&属性 |
含义 |
pptx.chart.data.CategoryChartData() |
封装图表数据 |
pptx.enum.chart.XL_CHART_TYPE |
图表类型 |
CategoryChartData.categories |
设置分组 |
CategoryChartData.add_series() |
设置图表数据 |
slide.shapes.add_chart() |
from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches
# 创建一个Presentation对象
prs = Presentation()
# 添加一个幻灯片
slide = prs.slides.add_slide(prs.slide_layouts[5]) # 选择一个只有标题的布局
# 创建图表数据
chart_data = CategoryChartData()
# 设置图表的类别
chart_data.categories = ['类别1', '类别2', '类别3']
# 添加系列数据
chart_data.add_series('系列1', (19.2, 21.4, 16.7))
# 在幻灯片中添加图表
x, y, cx, cy = Inches(2), Inches(2), Inches(4.5), Inches(3) # 定义图表位置和大小
chart = slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
).chart
# 添加更多的系列数据
chart_data.add_series('系列2', (22.3, 28.6, 15.2))
# 保存演示文稿
prs.save('chart_example.pptx')
7. 设置图表样式
通过chart对象可以设置图表样式
函数名&属性 |
含义 |
chart.chart_style |
设置图表主题 |
chart.font.size |
设置图表字体大小 |
chart.category_axis.tick_labels.font.size |
设置分类轴字体大小 |
chart.category_axis.has_major_gridlines |
设置分类轴是否有表示线 |
chart.plots.has_data_labels |
设置是否显示图表标签 |
chart.data_labels.position |
设置图表标签位置 |
chart.has_legend |
设置是否显示图例 |
chart.lengend.font.size |
设置图例字体大小 |
chart.legend.position |
设置图例位置 |
chart.legend.include_in_layout |
设置图例布局是否在图表中 |
from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE, XL_LEGEND_POSITION,XL_LABEL_POSITION
from pptx.util import Inches, Pt
# 创建一个Presentation对象
prs = Presentation()
# 添加一个幻灯片
slide = prs.slides.add_slide(prs.slide_layouts[5]) # 选择一个只有标题的布局
# 创建图表数据
chart_data = CategoryChartData()
# 设置图表的类别
chart_data.categories = ['类别1', '类别2', '类别3']
# 添加系列数据
chart_data.add_series('系列1', (19.2, 21.4, 16.7))
# 在幻灯片中添加图表
x, y, cx, cy = Inches(2), Inches(2), Inches(4.5), Inches(3) # 定义图表位置和大小
chart = slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
).chart
# 设置图表主题
chart.chart_style = 10 # 选择其中一个预定义的样式编号
# 设置图表字体大小(全局)
chart.font.size = Pt(12)
# 设置分类轴字体大小
chart.category_axis.tick_labels.font.size = Pt(10)
# 设置分类轴是否有表示线
chart.category_axis.has_major_gridlines = True
# 设置是否显示图表标签
chart.plots[0].has_data_labels = True
# 设置图表标签位置
chart.plots[0].data_labels.position = XL_LABEL_POSITION.OUTSIDE_END
# 设置是否显示图例
chart.has_legend = True
# 设置图例字体大小
chart.legend.font.size = Pt(12)
# 设置图例位置
chart.legend.position = XL_LEGEND_POSITION.BOTTOM
# 设置图例是否包括在图表布局中
chart.legend.include_in_layout = False
# 保存演示文稿
prs.save('chart_example.pptx')
8. 获取PPT所有内容
from pptx import Presentation
path_to_presentation = 'example.pptx'
prs = Presentation(path_to_presentation)
# text_runs will be populated with a list of strings,
# one for each text run in presentation
text_runs = []
for slide in prs.slides:
for shape in slide.shapes:
if not shape.has_text_frame:
continue
for paragraph in shape.text_frame.paragraphs:
for run in paragraph.runs:
text_runs.append(run.text)
print(text_runs)
三、python操作PDF
(一) 介绍
pypdf 是一个免费开源的纯 python PDF 库,能够分割、合并、裁剪和转换 PDF 文件的页面。它还可以向 PDF 文件添加自定义数据、查看选项和密码。 pypdf 还可以从 PDF 中检索文本和元数据。
(二) 安装
pip install pypdf2
pip install pdfplumber
(三) 读取pdf
1. 使用pypdf读取pdf
读取pdf我们使用的是pypdf2模块的PdfReaderr对象。
通过PdfReader对象读取pdf对象后,可以调用pages属性获取总页数
获取到总页数后,可以通过遍历pages属性获取单页数据。
获取单叶数据后可以通过extract_text()方法获取文本数据。
# pip install pypdf2
from PyPDF2 import PdfReader
def read_pdf1():
# 打开文件
with open('./base_data/test_pdf.pdf', 'rb') as f:
# 将打开的文件传递给Reader对象
reader = PdfReader(f)
# 获取页面总页数
number = len(reader.pages)
print(number)
# 获取单页
page = reader.pages[1]
# 提取文本
info = page.extract_text()
print(info)
2. 使用pdfplumber读取文件
def read_pdf2():
import pdfplumber
# 打开文件
with pdfplumber.open('./base_data/test_pdf.pdf') as f:
# 获取数据
print(f.pages)
for p in f.pages:
print(p.extract_text())
(四) 合并PDF
1. 合并pdf的思路
- 读取源pdf
- 写入到一个新的pdf
2. 常用方法和属性
- 使用PdfWriter对象新增PDF文件
- 使用add_page()方法新增一页数据。
def merge_file(*m_path):
from PyPDF2 import PdfReader,PdfWriter
# 创建一个写入对象
writer = PdfWriter()
# 读取数据PdfFileWriter
for path in m_path:
reader = PdfReader(open(path, 'rb'))
# 读取页面数据
for p in reader.pages[1:3]:
# 写到新的pdf
writer.add_page(p)
# 保存
with open("./Create_Data/02_合并pdf.pdf",'wb') as f:
writer.write(f)
if __name__ == '__main__':
path = "./base_data/test_pdf.pdf"
merge_file(path, path)
(五) 拆分文件
1. 拆分思路
- 读取PDF文件
- 写入到一个新的PDF文件中
2. 代码实现
from PyPDF2 import PdfReader, PdfWriter
def chai_PDF(path):
# 读取数据
reader = PdfReader(open(path,"rb"))
# 获取页面数据
for i, p in enumerate(reader.pages):
writer = PdfWriter()
writer.add_page(p)
# 保存数据
with open(f'./Create_Data/03_拆分pdf{i}.pdf','wb') as f:
writer.write(f)
if __name__ == '__main__':
path = './Create_Data/02_合并pdf.pdf'
chai_PDF(path)
(六) 加密文档
1. 使用方法
writer对象的encrypt方法用于给文档增加密码。
from PyPDF2 import PdfWriter, PdfReader
def jia_mi(path):
# 读取数据
reader = PdfReader(open(path, "rb"))
# 创建写Pdf的对象
writer = PdfWriter()
# 写入密码
writer.encrypt("123")
# 把内容复制pdf的Writer中
for p in reader.pages:
writer.add_page(p)
# 保存数据
with open("./Create_Data/04_加密PDF.pdf", 'wb') as f:
writer.write(f)
if __name__ == '__main__':
path = './base_data/test_pdf.pdf'
jia_mi(path)
四、邮件自动化
使用python发送邮件我们需要使用smtplib和email模块
我们需要先获取到我们邮箱的类型。和邮箱的smtp密码
(一) 发送普通邮件(以qq邮箱为例)
1. 发送邮件的思路
- 使用smtplib模块的SMTP方法指定邮件类型。QQ邮箱为smtp.qq.com
- 使用SMTP对象的login方法指定登陆邮箱和密码。即发件箱账号密码(密码为smtp服务密码)
- 使用email模块的MIMEText方法指定发送文本,文本类型,文本编码
- 设置发送来源和发送主题
- 调用sendmail方法发送文件
import smtplib
from email.mime.text import MIMEText
from email.header import Header
def send_email():
# 设置要登录邮箱
smpt_obj = smtplib.SMTP("smtp.qq.com")
# 登录邮箱
smpt_obj.login("address", 'password')
# 编辑内容
mail_text = 'content'
# plain 原生文本模式
msg_body = MIMEText(mail_text, "plain", "utf-8")
# 设置从哪发送
msg_body['From'] = Header("nickname <addr_from>") # 注意尖括号应在外面
msg_body["Subject"] = Header("Subject", "utf-8")
# 发送邮件
smpt_obj.sendmail("addr_from", "addr_to", msg_body.as_string())
if __name__ == '__main__':
send_email()
(二) 发送HTML邮件
import smtplib
from email.mime.text import MIMEText
from email.header import Header
def send_email():
# 设置要登录邮箱
smpt_obj = smtplib.SMTP("smtp.qq.com")
# 登录邮箱
smpt_obj.login("address ", 'password')
# 编辑内容
mail_text = """
<h1 style='color:red'>这是一个HTML邮件通知</h1>
<p>设置邮件内容</p>
<p><a href="https://www.itbaizhan.com">这个是连接</a></p>
"""
# html 表示内容是html代码
msg_body = MIMEText(mail_text, "html", 'utf-8')
# 设置从哪发送
msg_body['From'] = Header("nickname <addr_from>", )
msg_body["Subject"] = Header("测试python自动邮件", "utf-8")
# 发送邮件
smpt_obj.sendmail("addr_from", "addr_to", msg_body.as_string())
if __name__ == '__main__':
send_email()
(三) 发送附件邮件
import smtplib
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.header import Header
def send_file_email():
# 设置邮箱服务器
smtp_obj = smtplib.SMTP("smtp.qq.com")
# 登录邮箱
smtp_obj.login("address ", 'password')
# 设置邮件内容
# 文本
msg_text = MIMEText("这个是有附件的邮件","plain", "utf-8")
# 附件
msg_file = MIMEApplication(open("./base_data/工资数据.xlsx",'rb').read())
msg_file.add_header("Content-Disposition", "attachment", filename="01.jpg")
# 封装要发送的数据
part = MIMEMultipart()
part.attach(msg_text)
part.attach(msg_file)
# 设置邮件其他信息
part['From'] = Header("nickname <address_from>", )
part["Subject"] = Header("附件邮件""utf-8")
# 发送邮件
smtp_obj.sendmail("address_from","addr_to", part.as_string())
if __name__ == '__main__':
send_file_email()
(四) 批量发送邮件
import smtplib
from email.header import Header
from email.mime.text import MIMEText
from openpyxl import load_workbook
def send_many_mail():
# 设置登录邮箱服务器
smtp_obj = smtplib.SMTP("smtp.qq.com")
# 登录邮箱
smtp_obj.login("addr", 'password')
# 打开Excel文件
wb = load_workbook("./base_data/工资数据.xlsx", data_only=True)
# 激活工作簿
sh = wb.active
# 读取数据--遍历 获取每一行 sh.insert_rows
for i,r in enumerate(sh.iter_rows()):
if i != 0:
# 编辑内容
msg_txt = f"""
<h3>您好:{r[1].value}</h3>
<p>请查询您的2020年九月工资</p>
<table border="1">
<tr>
<td>工号</td>
<td>姓名</td>
<td>部门</td>
<td>基本工资</td>
<td>提成 </td>
<td>加班工资</td>
<td>社保扣除</td>
<td>考勤扣除</td>
<td>应发工资</td>
<td>邮箱</td>
</tr>
<tr>
<td>{r[0].value}</td>
<td>{r[1].value}<td>
<td>{r[2].value}<td>
<td>{r[3].value}</td>
<td>{r[4].value}<td>
<td>{r[5].value}<td>
<td>{r[6].value}</td>
<td>{r[7].value}</td>
<td>{r[8].value}</td>
<td>{r[9].value}</td>
</tr>
</table>
"""
msg = MIMEText(msg_txt, "html", 'utf-8')
# 设置邮件其他信息
msg["From"] = Header("nickname <addr_from>")
msg["Subject"] = Header("工资条", "utf-8")
# 发送邮件
smtp_obj.sendmail("addr_to", f"{r[9].value}", msg.as_string())
print(f"{r[1].value} 工资条发送成功")
if __name__ == '__main__':
send_many_mail()
五、压缩文件自动化
使用python操作压缩文件使用的是zipfile模块。
(一) 压缩文件与解压缩
使用ZipFile对象可以读取和创建一个zip压缩包文件。
from zipfile import ZipFile
def zip_in():
"""
压缩文件
:return:
"""
# 创建压缩文件
with ZipFile('./Create_Data/zip_in.zip',"w") as f:
f.write(r"D:\GYP_PY\14办公自动化\Text\06.py")
# 添加压缩文件
def zip_out():
"""
解压缩
:return:
"""
with ZipFile('./Create_Data/zip_in.zip', "r") as f:
# 读取数据
print(f.namelist())
# 解压数据
f.extractall("./Create_Data")
if __name__ == '__main__':
# zip_in()
zip_out()
(二) 压缩工具开发
import os
from zipfile import ZipFile
def new_file(base_path, zip_path):
"""
:param base_path: 源文件地址
:param zip_path: 压缩文件保存地址
:return:
"""
# 创建一个压缩文件
with ZipFile(zip_path,"w") as zip:
# 判断base_path是文件还是文件夹
if os.path.isfile(base_path):
zip.write(base_path)
else:
# 遍历文件夹
for root, dirs, files in os.walk(base_path):
# root遍历的当前文件夹名称
# dirs 当前路径包含的文件夹
# files 当前路径包含的文件
for f in files:
zip.write(os.path.join(root, f))
# 在压缩包追加文件
def new_file(base_path, zip_path):
"""
:param base_path: 源文件地址
:param zip_path: 压缩文件保存地址
:return:
"""
# 创建一个压缩文件
with ZipFile(zip_path, "a") as zip:
# 判断base_path是文件还是文件夹
if os.path.isfile(base_path):
zip.write(base_path)
else:
# 遍历文件夹
for root, dirs, files in os.walk(base_path):
# root遍历的当前文件夹名称
# dirs 当前路径包含的文件夹
# files 当前路径包含的文件
for f in files:
zip.write(os.path.join(root,f))
if __name__ == '__main__':
new_file(r"D:\GYP_PY\14办公自动化\Text\05.py", "./Create_Data/zip_in.zip")
(三) 暴力破解密码
暴力破解密码思路就是用数字和字母进行排列组合。依次试验。
# 解压数据 密码
from zipfile import ZipFile
def passwd(path, pwd):
with ZipFile(path,"r") as zip :
print(f"正在尝试用密码{pwd}解压")
try:
zip.extractall("./Create_data/", pwd=str(pwd).encode())
print(f"正确密码是{pwd}")
return True
except Exception as e:
pass
def create_pwd(pwd_len):
words = "123456789abcde"
import itertools as its
for i in range(1, pwd_len+1):
base = its.product(words,repeat=i)
for b in base:
# 节省空间
yield "".join(b)
if __name__ == '__main__':
# passwd("./base_data/zip_info.zip", '123')
for i in (create_pwd(5)):
flag = passwd("./base_data/zip_info.zip", i)
if flag:
break