数据科学之数据管理|python for office

现如今,随着计算机的逐渐普及。现代化办公成为每个职场人必备的技能,本文档就来介绍,如何使用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 Inchesdocument = 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 = Truedocument.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().cellsrow_cells[0].text = str(qty)row_cells[1].text = idrow_cells[2].text = descdocument.add_page_break()document.save('demo.docx')

效果

(三) 使用python-docx新建word文档

1. 创建文档

使用python-docx模块中Document对象来创建一个word文档

from docx import Documentdocument = 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 afile-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 theappropriate XML form for a tab. `text` can also include newline (``\\n``) orcarriage return (``\\r``) characters, each of which is converted to a linebreak."""return self._body.add_paragraph(text, style)

该方法会返回段落对象,即在文档末尾返回一个段落。

使用实例:

from docx import Documentdocument = 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 = stylereturn paragraph

使用例子

from docx import Documentdocument = 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 styledetermined 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" % levelreturn self.add_paragraph(text, style)

在设置标题级别时,如果设置标题级别为0,则视为追加一个段落标题,即可以理解成文档标题。标题可以取值是0-9;

使用实例

from docx import Documentdocument = 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 Documentdocument = 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 = stylereturn table

  • rows: 行
  • cols: 列

为了访问表格内容,我们可以直接访问表格单元格。我们使用table对象或者row对象的cell方法来制定单元格。表对象,以及表的行列对象是可迭代对象,可以通过索引进行访问,也可以用for进行遍历。

获取单元格的两种方法

from docx import Documentdocument = 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 Documentdocument = 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().cellscells[0].text = str(item[0])  # Access quantity using indexcells[1].text = item[1]       # Access SKU using indexcells[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 Inchesdoc = 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 Inchesdoc = Document()doc.add_heading('增加段落样式', level=1)
doc.add_paragraph('Lorem ipsum dolor sit amet.', style='ListBullet')doc.save('test.docx')

此外,还可以通过paragraph对象的style属性来增加段落样式

9. 应用粗体和黑体

  1. 段落包含所有块级格式,如缩进、行高、制表符等。
  2. 字符级格式(如粗体和斜体)应用于运行级别。段落内的所有内容都必须在运行内,但可以有多个运行。因此,中间有一个粗体单词的段落需要三个运行,一个普通运行,一个包含单词的粗体运行,以及另一个用于后面文本的普通运行。

当通过向 .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 Documentdoc = 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库。

(一) 介绍

  1. 介绍
    1. python-pptx 是一个用于创建、读取和更新 PowerPoint (.pptx) 文件的 Python 库。
    2. 典型用途是从动态内容(例如数据库查询、分析输出或 JSON 有效负载)生成 PowerPoint 演示文稿,可能是响应 HTTP 请求并下载生成的 PPTX 文件作为响应。它可以在任何支持 Python 的平台上运行,包括 macOS 和 Linux,并且不需要安装或许可 PowerPoint 应用程序。
    3. 它还可用于分析语料库中的 PowerPoint 文件,也许可以提取搜索索引文本和图像。
    4. 还可以用于简单地自动化制作一两张幻灯片,而手动制作会很乏味,这就是这一切的开始。
  1. 更多信息可参见 python-pptx 文档。: python-pptx — python-pptx 1.0.0 documentation
  2. 安装: pip install python-pptx
  3. 依赖:pillow lxml xlsxwriter

(二) 简单例子

from pptx import Presentationprs = 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 Presentationprs = 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 Inchesimg_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 Inchesprs = Presentation()
title_only_slide_layout = prs.slide_layouts[5]
slide = prs.slides.add_slide(title_only_slide_layout)
shapes = slide.shapesshapes.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 balancefor n in range(2, 6):shape = shapes.add_shape(MSO_SHAPE.CHEVRON, left, top, width, height)shape.text = 'Step %d' % nleft = left + width - Inches(0.4)prs.save('test.pptx')

5. 增加表格

使用shape对象的add_table()方法来增加表格。

from pptx import Presentation
from pptx.util import Inchesprs = Presentation()
title_only_slide_layout = prs.slide_layouts[5]
slide = prs.slides.add_slide(title_only_slide_layout)
shapes = slide.shapesshapes.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:continuefor 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()# 读取数据PdfFileWriterfor path in m_path:reader = PdfReader(open(path, 'rb'))# 读取页面数据for p in reader.pages[1:3]:# 写到新的pdfwriter.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. 发送邮件的思路

  1. 使用smtplib模块的SMTP方法指定邮件类型。QQ邮箱为smtp.qq.com
  2. 使用SMTP对象的login方法指定登陆邮箱和密码。即发件箱账号密码(密码为smtp服务密码)
  3. 使用email模块的MIMEText方法指定发送文本,文本类型,文本编码
  4. 设置发送来源和发送主题
  5. 调用sendmail方法发送文件
import smtplib
from email.mime.text import MIMEText
from email.header import Headerdef 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 Headerdef 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 Headerdef 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_workbookdef 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_rowsfor 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 ZipFiledef 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 ZipFiledef 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 Trueexcept Exception as e:passdef create_pwd(pwd_len):words = "123456789abcde"import itertools as itsfor 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18057.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端框架】Vue3 中 `setup` 函数的作用和使用方式

在 Vue 3 里&#xff0c;setup 函数是组合式 API 的核心入口&#xff0c;为开发者提供了更灵活、高效的组件逻辑组织方式。以下为你详细介绍其作用和使用方式&#xff1a; 作用 1. 初始化响应式数据 在 setup 函数中&#xff0c;我们能够使用 ref 和 reactive 等函数来创建响…

MySQL无法连接到本地localhost的解决办法2024.11.8

问题描述&#xff1a;我的MySQL可以远程连接服务器&#xff0c;但无法连接自己的localhost。 错误提示&#xff1a; 2003 - Cant connet to MySQL server on localhost(10061 "Unknown error")查找问题原因&#xff1a; 1. 检查环境变量是否正确&#xff1a;发现没…

STM32HAL库快速入门教程——常用外设学习(2)

目录 一、STM32HAL库开发&#xff08;8&#xff09;——CubeMX配置DMA 1.1、什么是DMA&#xff1f; 1.2、内存内存之间的传输&#xff08;单次&#xff09; ​编辑 1.3、内存外设之间的传输&#xff08;ADC&#xff09; 二、STM32HAL库开发&#xff08;9&#xff09;——…

LabVIEW与小众设备集成

在LabVIEW开发中&#xff0c;当面临控制如布鲁克OPUS红外光谱仪这类小众专业设备的需求&#xff0c;而厂家虽然提供了配套软件&#xff0c;但由于系统中还需要控制其他设备且不能使用厂商的软件时&#xff0c;必须依赖特定方法通过LabVIEW实现设备的控制。开发过程中&#xff0…

PyQt组态软件 拖拽设计界面测试

PyQt组态软件测试 最近在研究PyQt,尝试写个拖拽设计界面的组态软件&#xff0c;目前实现的功能如下&#xff1a; 支持拖入控件&#xff0c;鼠标拖动控件位置 拖动控件边缘修改控件大小支持属性编辑器&#xff0c;修改当前选中控件的属性 拖动框选控件&#xff0c;点选控件 控…

AI如何与DevOps集成,提升软件质量效能

随着技术的不断演进&#xff0c;DevOps和AI的融合成为推动软件开发质量提升的重要力量。传统的DevOps已经为软件交付速度和可靠性打下了坚实的基础&#xff0c;而随着AI技术的加入&#xff0c;DevOps流程不仅能提升效率&#xff0c;还能在质量保障、缺陷预测、自动化测试等方面…

Mac配置Flutter开发环境

1、访问 Flutter 官网&#xff0c;下载安装Flutter SDK 2、将 Flutter 添加到 PATH 环境变量 找到用户文件夹中的.zshrc隐藏文件&#xff08;隐藏文件显示方式&#xff1a;shiftcommand.&#xff09;&#xff0c;打开.zshrc文件&#xff0c;添加Flutter SDK路径&#xff0c;注…

Linux系统使用ollama本地安装部署DeepSeekR1 + open-webui

Linux系统使用ollama本地安装部署DeepSeekR1 open-webui 1. 首先&#xff0c;下载安装ollama #下载安装脚本并执行 curl -fsSL https://ollama.com/install.sh | sh #安装完成后查看ollama版本 ollama --version2. 使用ollama下载deepseek #不同的参数规格对硬件有不同的要…

【Kubernetes】常用命令全解析:从入门到实战(中)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是k8s 2、K8s的核心功能 二、资…

[ComfyUI]腾讯开源黑科技Sonic,插件更新,更加可控啦

一、Sonic更新介绍 大家还记得我前分享过腾讯开源的Sonic这个项目吧&#xff0c;通过照片声音就可以生成非常不错的数字人开口说话的视频。 当时我就挺满意的&#xff0c;不过那时候输出还只能输出正方形的视频&#xff0c;这点就让我留有遗憾。 今天我再去翻作者的项目官网…

设计模式Python版 命令模式(上)

文章目录 前言一、命令模式二、命令模式示例 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a;关注类和对象之间的组合&…

微服技术栈之Spring could gateway

0 前言 之前使用到的gateway技术栈 &#xff0c;光靠记忆可能没有记住那么多的&#xff0c;gateway当今比较主流的网关技术栈了。说到gateway&#xff0c;不得不提及Zuul&#xff0c;而Zuul已经被淘汰了。 1 概述 Could全家桶有个很重要的组件就是网关&#xff0c;在1.X版本…

上课啦 | 2月17日软考高项【5月备考班】

相关文章推荐 福利&#xff1a;【软考-电子书】赠送 | 信息系统项目管理师教程 软考证书以考代评评定的职称是什么&#xff1f;聘任步骤&#xff1f; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 软考 高 项 课程&#xff1a;2月17日开课 | 软考-高…

小米 R3G 路由器刷机教程(Pandavan)

小米 R3G 路由器刷机教程&#xff08;Pandavan&#xff09; 一、前言 小米 R3G 路由器以其高性价比和稳定的性能备受用户青睐。然而&#xff0c;原厂固件的功能相对有限&#xff0c;难以满足高级用户的个性化需求。刷机不仅可以解锁路由器的潜能&#xff0c;还能通过第三方固…

【电脑】u盘重装win7

u盘必须8GB以上 1. CPU型号 首先查看CPU的型号看看到底能不能装win7 2. 下载光盘映像文件 网址 看电脑是多少位的机器(32位下载x86 64位下载x64) 一共是这么多个版本按需下载对应的版本 电脑小白推荐无脑下载旗舰版 将链接复制到迅雷进行下载 3. 下载软碟通 网址 下…

wps或office的word接入豆包API(VBA版本)

直接上代码&#xff0c;由于时间匆忙&#xff0c;以后写个详细的教程 #If VBA7 ThenPrivate Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As…

Redis——优惠券秒杀问题(分布式id、一人多单超卖、乐悲锁、CAS、分布式锁、Redisson)

#想cry 好想cry 目录 1 全局唯一id 1.1 自增ID存在的问题 1.2 分布式ID的需求 1.3 分布式ID的实现方式 1.4 自定义分布式ID生成器&#xff08;示例&#xff09; 1.5 总结 2 优惠券秒杀接口实现 3 单体系统下一人多单超卖问题及解决方案 3.1 问题背景 3.2 超卖问题的…

USB Flash闪存驱动器安全分析(第一部分)

翻译原文链接&#xff1a;Hacking Some More Secure USB Flash Drives (Part I) | SySS Tech Blog 文章翻译总结&#xff1a;文章对一些具有AES硬件加密的USB闪存驱动器的网络安全分析研究。研究由SySS的IT安全专家Matthias Deeg进行&#xff0c;他在2022年初发现了几个安全漏…

[前端] axios网络请求二次封装

一、场景描述 为什么要对axios网络请求进行二次封装? 解决代码的复用&#xff0c;提高可维护性。 —这个有两个方案&#xff1a;一个是二次封装一个是实例化。&#xff08;设置一些公共的参数&#xff0c;然后进行请求&#xff09; 为什么可以解决代码的复用&#xff1a; 这是…

DeepSeek助力:打造属于你的GPTs智能AI助手

文章目录 一、环境准备1.安装必要的工具和库2. 选择合适的开发语言 二、核心技术选型1. 选择适合的AI框架 三、功能实现1. 文本生成与对话交互2. 代码生成与自动补全3. 数据分析与报告生成 四、案例实战1. 搭建一个简单的聊天机器人2. 创建一个代码生成器 五、总结与展望1. 当前…