Python--高级编程

一、正则表达式(Ctrl+单击查看函数结构)

1、正则引入

正则表达式是一种用于匹配和处理文本的强大工具。它可以帮助开发者在文本中查找、替换和提取特定模式的内容。以下是正则表达式的一些常见用途:

  1. 模式匹配:正则表达式可以用来检查一个字符串是否符合某种特定的模式。例如,可以使用正则表达式来验证一个邮箱地址或者检查一个字符串是否是一个有效的日期格式。

  2. 文本搜索和替换:正则表达式可以在文本中搜索和替换特定的模式。例如,可以使用正则表达式来查找所有包含特定单词的句子,并将其替换为其他内容。

  3. 数据提取:正则表达式可以从文本中提取特定的数据。例如,可以使用正则表达式从一个包含电话号码的字符串中提取出所有的电话号码。

  4. 数据验证:正则表达式可以用来验证用户输入的数据是否符合特定的格式要求。例如,可以使用正则表达式来验证一个密码是否包含特定的字符和长度要求。

'''
需求:
封装函数,判断手机号码是否合法?
a.长度是11位
b.数字1开头
c.手机号码的组成全部是数字
'''
def checkPhone(tel):
    if len(tel) != 11:
        return "手机号码的长度不符合要求"
    if tel[0] != "1":
        return "手机号码不是1开头"
    if not tel.isdigit():
        return "手机号码的组成不是全部是数字"
    return  "合法的手机号码"

# 2. 使用正则表达式验证手机号码是否合法
import re   # 导入正则表达式相关的模块
result = re.search('^1\d{10}$','18617767027')
# print(result)
if result:
    print('手机号码合法')
else:
    print('手机号码不合法')

2、正则常用函数

import re

# \d: 表示 0-9之间的任意数字
# +: 表示前面的内容可以出现1次或者多次

'''
1.re.match(要匹配的正则表达式,要验证的字符串,可选参数(修饰符)) 匹配开头
作用: 匹配字符串是否以指定的正则内容开头,若匹配成功,返回符合要求的对象,若匹配失败,返回None
'''
print(re.match('\d+', '123dsdg678',flags=10))  # <re.Match object; span=(0, 3), match='123'>
print(re.match('\d+', 'dshjhj123dsdg678'))  # None,不是数字开头
e = '113333'
b = '11'
print(re.match(b, e,re.I))  # 检验e是否以b开头

'''
2.re.search(正则表达式,要验证的字符串,可选参数(修饰符))  包含
作用: 匹配字符串是否包含指定的正则内容,若匹配成功,返回对象,若匹配失败,返回None
'''
print(re.search('\d+', '123dsdg678'))  # <re.Match object; span=(0, 3), match='123'>
print(re.search('\d+', 'dshjhj123dsdg678'))  # <re.Match object; span=(6, 9), match='123'>

'''
3.re.findall(正则表达式,要验证的字符串)  获取包含的内容
作用: 使用正则表达式获取匹配成功的数据,返回的是一个列表
'''
print(re.findall('\d+', 'hsjdhsj134243dshkdhks9877dhsjh5665dsd54778'))  # ['134243', '9877', '5665', '54778']

3、 正则匹配规则

import re
'''  
以下匹配规则只能匹配一个字符
. : 表示除了换行符以外的所有的字符
[] :表示的是一个范围
- : 表示的是一个区间
[0123456789]: []表示集合,表示匹配[]中的任意一个字符
[a-z]: 匹配任意的一个小写字母
[A-Z]: 匹配任意的一个大写字母
[0-9a-zA-Z]:匹配任意的数字和字母
[^0-9]: 匹配任意的一个非数字字符
\d: 表示匹配0-9之间任意的数字 等同于 [0-9]
\D: 表示对\d进行取反,匹配任意的非数字字符  等同于 [^0-9]
\w: 表示匹配任意的数字 字母 和下划线  等同于 [0-9a-zA-Z_]
\W: 表示对\w进行取反,匹配数字 字母 下划线之外任意字符
\s: 表示匹配任意的空白符(空格  换行  回车  制表符)  等同于[\r\t\n\f]
\S: 表示对\s进行取反

print(re.search("he[0-9]llo","he87llo"))  # None 因为 [0-9]只能匹配一个数字
print(re.search("he[0-9]llo","he8llo"))   # <re.Match object; span=(0, 6), match='he8llo'>

print(re.search("98[a-z]76","98f76"))   # <re.Match object; span=(0, 5), match='98f76'>
print(re.search("98[A-Z]76","98H76"))   # <re.Match object; span=(0, 5), match='98H76'>
print(re.search("apple\d","apple9"))    # <re.Match object; span=(0, 6), match='apple9'>
print(re.search("8765\D","8765f"))      # <re.Match object; span=(0, 5), match='8765f'>
print(re.search("banana\D","banana5"))  # None
print(re.search("good\w","good4"))      # <re.Match object; span=(0, 5), match='good4'>
print(re.search("322\w","322k"))        # <re.Match object; span=(0, 4), match='322k'>
print(re.search("785\w","785_"))        # <re.Match object; span=(0, 4), match='785_'>
print(re.search("785\W","785@"))        # <re.Match object; span=(0, 4), match='785@'>
print(re.search("785\W","785s"))        # None

'''
# 模式修正符: 主要是用于修饰正则表达式
'''
re.S:可以让正则表达式匹配换行   \n表示换行
re.I: 可以让正则表达式忽略字母大小写

print(re.search('shenzhen.','shenzhen875ds'))   # <re.Match object; span=(0, 9), match='shenzhen8'>
print(re.search('shenzhen.','shenzhen\n'))    # None
print(re.search('shenzhen.','shenzhen\n',re.S))  # <re.Match object; span=(0, 9), match='shenzhen\n'>

print(re.search("98765[a-z]","98765asw"))  # <re.Match object; span=(0, 6), match='98765a'>
print(re.search("98765[a-z]","98765DGH"))  # None
print(re.search("98765[a-z]","98765DGH",re.I))  # <re.Match object; span=(0, 6), match='98765D'>
'''

# 匹配多个字符:
'''
? :表示匹配前面的字符出现0次或者1次
+ :表示匹配前面的字符出现1次或者多次    贪婪模式
* :表示匹配前面的字符出现0次或者多次    贪婪模式
{} :表示匹配前面的字符可以出现指定的次数或者出现指定范围内的次数,   贪婪模式
{4}: 表示前面的字符只能出现4次
{4,9}:表示前面的字符可以出现4-9次
{4,}: 表示前面的字符至少出现4次
{,4}: 表示前面的字符最多可以出现4次
'''
print(re.search("face?book","facebook"))  # <re.Match object; span=(0, 8), match='facebook'>   e出现1次的情况
print(re.search("face?book","facbook"))   # <re.Match object; span=(0, 7), match='facbook'>   e出现0次情况
print(re.search("face+book","facebook"))  # <re.Match object; span=(0, 8), match='facebook'>  e出现1次的情况
print(re.search("face+book","faceeeeeebook"))  # <re.Match object; span=(0, 13), match='faceeeeeebook'>    e出现多次的情况

print(re.search("face*book","facbook"))   # <re.Match object; span=(0, 7), match='facbook'>  e出现0次的情况
print(re.search("face*book","faceeeebook"))  # <re.Match object; span=(0, 11), match='faceeeebook'>  e出现多次的情况
print(re.search("face{4}book","faceeeebook"))   # <re.Match object; span=(0, 11), match='faceeeebook'>    e出现4次的情况
print(re.search("face{4}book","faceeeeeeebook"))  # None   e出现不是4次的情况
print(re.search("face{4,9}book","faceeeeeeebook"))  # <re.Match object; span=(0, 14), match='faceeeeeeebook'>  e出现4-9次的情况
print(re.search("face{4,9}book","faceeebook"))  # None    e出现不是4-9次的情况
print(re.search("face{4,}book","faceeeeeebook"))  # <re.Match object; span=(0, 13), match='faceeeeeebook'>  e出现至少4次的情况
print(re.search("face{,4}book","faceebook"))   # <re.Match object; span=(0, 9), match='faceebook'>   e最多出现4次的情况

4、 边界字符规则

import re
'''
1.边界符:
^: 行首匹配(以指定字符开头)  和 [^] 不是一个含义
$: 行尾匹配(以指定字符结束)
^文本$: 表示精准匹配

print(re.search('^world','world'))  # <re.Match object; span=(0, 5), match='world'>
print(re.search('^world','aworld'))  # None
print(re.search('world$','world'))  # <re.Match object; span=(0, 5), match='world'>
print(re.search('world$','worldsf')) # None
print(re.search('^world$','world'))  # <re.Match object; span=(0, 5), match='world'>
print(re.search('^world$','wo12rlf3d'))   # None
'''

'''
2. 
\ 表示转义字符,作用是让符号失去原有的意义
. 在正则表达式表示匹配除了换行\n之外的任意字符,  \.这个时候,这个.就是一个普通的符号了

| 表示或者, 正则表达式1 | 正则表达式2  只要满足其中的一个正则表达式即可


print(re.search('goog.le','googlle'))  # <re.Match object; span=(0, 7), match='googlle'>
print(re.search('goog\.le','goog.le'))  # <re.Match object; span=(0, 7), match='goog.le'>

print(re.search('cd|ef','123cd87878'))  # <re.Match object; span=(3, 5), match='cd'>
print(re.search('cd|ef','8765ef434'))   # <re.Match object; span=(4, 6), match='ef'>
'''

'''
3.词边界(了解)
\b: 匹配一个单词的边界,也就是单词和空格之间的位置
\B: 对\b进行取反
'''
print(re.search(r'google\b',"123google hello world"))  # <re.Match object; span=(3, 9), match='google'>
print(re.search(r'google\B',"123google hello world"))  # <re.Match object; span=(3, 9), match='google'>   # None

5、正则函数

import re
'''
1.re.compile()  编译正则表达式,用于提高正则匹配的效率
'''
string = "010-87458345"
com = re.compile('(\d{3})-(\d{8})')  # 编译正则表达式
print(com.findall(string))   #  [('010', '87458345')]

# 2.re.split()  按照指定的正则表达式拆分
print(re.split('\d','hello12world35boy'))  # ['hello', '', 'world', '', 'boy']

# 3.匹配中文
chinese = "[\u4e00-\u9fa5]+"
print(re.search(chinese,'hello 你好 world 世界 girl 女孩'))  # <re.Match object; span=(6, 8), match='你好'>

# 4.re.sub 和 re.subn()  替换字符中正则匹配到内容为指定字符
# re.subn() 会显示替换的总次数
str1 = "下周 大家就开始 进入年假 模式,提前祝大家 新春快乐"
print(re.sub("\s+",'.......',str1))  # 下周.......大家就开始.......进入年假.......模式,提前祝大家.......新春快乐
print()
print(re.subn("\s+",'.......',str1))  # ('下周.......大家就开始.......进入年假.......模式,提前祝大家.......新春快乐', 4)

二、办公自动化-操作excel

  1、python读取xls文件 

import xlrd # 该模块用于读取xls文件
# 获取xls文件中的工作对象
wb = xlrd.open_workbook(r'E:\xzai\py\Python\02-Python高级编程\2-python办公自动化-操作excel\resources\阿里巴巴2020年股票数据.xls')
# print(wb)      wb的位置
# 获取所有的工作表名称,获取对象个数
sheet_names = wb.sheet_names()
print(sheet_names)
# 通过工作表名称获取具体的工作表对象,就是有几个表
sheet = wb.sheet_by_name(sheet_names[0])
# 查看指定工作表的行数和列数
# print(sheet.nrows,sheet.ncols)
# 通过循环的方式查看工作表中具体单元格的数据
for row in range(sheet.nrows):# 行
    for col in range(sheet.ncols):# 列
        # print(row,col)
        # 通过cell对象中的value属性获取具体单元格的值
        value = sheet.cell(row,col).value
        # print(value)
        # 将第一行以外的数据进行格式化处理
        if row > 0:
            # 将第一列的日期数据转换为年月日的形式
            if col == 0:
                value = xlrd.xldate_as_tuple(value,0)
               # print(value)  # (2019, 12, 31, 0, 0, 0)
                value = f"{value[0]}年{value[1]:>02d}月{value[2]:>02d}日"
            else:
                # 将其他列的数据处理成小数位数为2位的数据
                value = f"{value:.2f}"
        print(value,end="\t")
    print() # 输出格式

# 获取单元格值的类型
# 0-空值   1-字符串   2-数字  3-日期   4-布尔  5-错误
last_cell_type = sheet.cell_type(sheet.nrows-1,sheet.ncols-1)
#print(last_cell_type)

# 获取第一行的数据
#print(sheet.row_values(0))

 2、python向xls文件中写入内容

import xlwt
import random

# 创建工作簿对象
wb = xlwt.Workbook()

# 创建工作表对象
sheet = wb.add_sheet("python-2107班级")
# 定义学生姓名
students = ["刘备","关羽","张飞","黄忠","马超","赵云"]

# 通过列表生成式的方式生成语文  数学  英语 三科的成绩 结果是二维列表
scores = [[random.randrange(50,101) for i in range(3)] for j in range(6)]
# print(scores)

# 创建表头数据
titles = ["姓名","语文","数学","英语"]
for index,title in enumerate(titles):
    # print(index,title)
    # 第一个参数表示行  第二个参数表示列  第三个参数表示具体的内容
    sheet.write(0,index,title)

# 将学生的姓名和成绩写入到工作表中去
for row in range(len(scores)):
    # print(row)
    sheet.write(row+1,0,students[row])  # 从第二行开始写入学生相关的数据信息
    for col in range(len(scores[row])):
        sheet.write(row+1,col+1,scores[row][col])  # 从第二行第二列开始填充成绩数据

# 将工作表数据保存到工作簿中去
wb.save("考试成绩.xls")
         


  3、python向xls文件中写入内容添加样式

import xlwt
import random

# 创建工作簿对象
wb = xlwt.Workbook()

# 创建工作表对象
sheet = wb.add_sheet("python-2107班级")
# 定义学生姓名
students = ["刘备","关羽","张飞","黄忠","马超","赵云"]

# 通过列表生成式的方式生成语文  数学  英语 三科的成绩 结果是二维列表
scores = [[random.randrange(50,101) for i in range(3)] for j in range(6)]
# print(scores)

# 创建表头数据
titles = ["姓名","语文","数学","英语"]

# 给表头数据添加样式   颜色设置为红色
header_style = xlwt.XFStyle()
pattern = xlwt.Pattern()
pattern.pattern = xlwt.Pattern.SOLID_PATTERN
# 0-黑色  1-白色 2-红色 3-绿色 4-蓝色 5-黄色 6-粉色 7-青色
pattern.pattern_fore_colour = 2
header_style.pattern = pattern

# 设置字体
font = xlwt.Font()
font.name = "华文楷体"
# 字体大小(20是基准单位  18表示18px)
font.height = 20 * 18

# 是否使用粗体
font.bold = True
# 是否使用斜体
font.italic = True
# 字体颜色
font.colour_index = 1
# 添加样式
header_style.font = font

# 设置对齐方式
align = xlwt.Alignment()
# 垂直方向的对齐方式
align.vert = xlwt.Alignment.VERT_CENTER
# 水平方向的对齐方式
align.horz = xlwt.Alignment.HORZ_CENTER
header_style.alignment = align

# 设置边框
borders = xlwt.Borders()

props = (
    ('top','top_colour'),('right','right_colour'),
    ('bottom','bottom_colour'),('left','left_colour')
)

# 通过循环设置边框四个方向的样式
for position,color in props:
    # 使用setattr内置函数动态给对象指定的属性设置值
    setattr(borders,position,xlwt.Borders.DASHED)
    setattr(borders,color,5)
header_style.borders = borders

# 设置行高的值
sheet.row(0).set_style(xlwt.easyxf(f'font:height {20 * 40}'))

for index,title in enumerate(titles):
    # 设置列宽为200px
    sheet.col(index).width = 20 * 200
    # 第一个参数表示行  第二个参数表示列  第三个参数表示内容 第四个参数表示样式
    sheet.write(0,index,title,header_style)

# 将学生的姓名和成绩写入到工作表中
for row in range(len(scores)):
    sheet.write(row+1,0,students[row])
    for col in range(len(scores[row])):
        sheet.write(row+1,col+1,scores[row][col])

# 将工作表数据保存到工作簿中去
wb.save("添加了样式的考试成绩.xls")
         


4、python读取xlsx格式的文件

import openpyxl
# 加载一个工作薄
wb = openpyxl.load_workbook(r"E:\xzai\千锋py\Python\02-Python高级编程\2-python办公自动化-操作excel\resources\阿里巴巴2020年股票数据.xlsx")

# 获取工作表名称
# print(wb.sheetnames)

# 获取要操作的工作表
sheet = wb.worksheets[0]
#获取工作表中单元格的范围
# print(sheet.dimensions)   # A1:G255

# 获取行数和列数
# print(sheet.max_row,sheet.max_column)  # 255 7

# 获取指定单元格的值
print(sheet.cell(3,3).value)
# print(sheet['C3'].value)
# print(sheet['G255'].value)
# 获取多个单元格
# print(sheet['A2:C5'])
# 获取单元格中所有的数据
for row in range(2,sheet.max_row+1):
    for col in "ABCDEFG":
        value = sheet[f'{col}{row}'].value
        print(value,end="\t")
    print()

5、python向xlsx格式的文件中写入内容

import random
import openpyxl

# 第一步:创建工作薄
wb = openpyxl.Workbook()

# 第二步:添加工作表
sheet = wb.active
sheet.title = "测试成绩"

# 第三步:写入数据 定义标题
titles = ("姓名","骑马","射箭","摔跤")

# 将标题数据写入到文件中
for col_index,title in enumerate(titles):
    sheet.cell(1,col_index+1,title)

# 定义学生姓名
students = ("欣迪","中文","文定","珊珊","惠君","俊德")

# 将姓名和成绩写入到文件中去
for row_index,student in enumerate(students):
    sheet.cell(row_index+2,1,student)
    for col_index in range(2,5):
        sheet.cell(row_index+2,col_index,random.randrange(50,101))

# 将数据保存到工作簿中去
wb.save("期末测试成绩.xlsx")

# 注意:在 2007年之后的xlsx文件中的行和列的索引是从1开始   
#      在2007年之前的xls文件中的行和列的索引是从0开始

6、python向xlsx格式的文件中添加样式

import openpyxl
from openpyxl.styles import Font,Alignment,Border,Side

# 设置对齐方式
alignment = Alignment(vertical="center",horizontal="center")

# 设置边框的线条
side = Side(color="ff7f50",style="mediumDashed")

# 加载工作薄
wb = openpyxl.load_workbook(r"C:\python07\day17\期末测试成绩.xlsx")

# 获取指定的工作表
sheet = wb.worksheets[0]

# 调整行高和列宽
sheet.row_dimensions[1].height = 30
sheet.column_dimensions["E"].width = 120

sheet['E1'] = "平均分"

# 设置字体
sheet.cell(1,5).font = Font(size=18,bold=True,color='ff1493',name="华文楷体")
# 设置对齐方式
sheet.cell(1,5).alignment = alignment

# 设置单元格边框
sheet.cell(1,5).border = Border(left=side,right=side,top=side,bottom=side)


for i in range(2,8):
# 利用公式计算每个学生的平均分
    sheet[f"E{i}"] = f"=average(B{i}:D{i})"
    sheet.cell(i,5).font = Font(size=12,color='4169e1',italic=True)
    sheet.cell(i,5).alignment = alignment

wb.save("添加样式-期末测试成绩.xlsx")

7、python使用openpyxl生成统计图表

from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference

wb = Workbook(write_only=True)  # 创建工作簿
sheet = wb.create_sheet("手机销量统计")  # 创建表
rows = [
    ('类别', 'G战区', "X战区"),
    ('小米', 88, 76),
    ('vivo', 68, 89),
    ('oppo', 87, 59)
]
# 向工作表中添加行
for row in rows:
    sheet.append(row)
# 创建图表对象
chart = BarChart()
# 图表类型,大小
chart.type = "col"
chart.style = 10
# 设置图表的标题
chart.title = "手机销量统计"
# 设置纵轴标题
chart.y_axis.title = "销量"
# 设置横轴标题
chart.x_axis.title = "手机品牌"
# 柱状图的数据区域 data 表示柱状图的数据区域,使用Reference函数指定了在工作表 e 中的数据范围。
# 其中,min_col=2 表示数据区域的起始列为第 2 列(G战区数据),min_row=1 表示数据区域的起始行为第 1 行,
# max_row=4 表示数据区域的结束行为第 4 行(包括标题行)
# ,max_col=3 表示数据区域的结束列为第 3 列(X战区数据)。这样,您将选择了工作表中包含数据的矩形区域。
data = Reference(sheet, min_col=2, min_row=1, max_row=5, max_col=3)
# 设置分类的范围

# categories 表示柱状图的分类区域,使用Reference函数指定了在工作表 e 中的分类范围。
# 其中,min_col=1 表示分类区域的起始列为第 1 列(类别),min_row=2 表示分类区域的起始行为第 2 行,
# max_row=4 表示分类区域的结束行为第 4 行。这样,您选择了工作表中的分类名称的范围。
# 接下来,使用 chart.add_data(data, titles_from_data=True) 将数据区域添加到柱状图中,
# 并使用 titles_from_data=True 参数将数据区域的第一行作为图表的标题。
# 最后,使用 chart.set_categories(categories) 将分类区域应用于柱状图的分类轴。
cats = Reference(sheet, min_col=1, min_row=2, max_row=5)
# 给图表添加数据
chart.add_data(data, titles_from_data=True)
# 给图表设置分类
chart.set_categories(cats)
chart.shape = 4
# 将图表插入到指定的单元格中
sheet.add_chart(chart, "A10")
wb.save("手机销量统计.xlsx")

三、word

1、python操作word文件

from pydoc import doc
from docx import Document
# docx.shared 用于设置字体大小(图片)等信息
from docx.shared import Cm,Pt

# 创建word文档对象
document = Document()
print(document)

# 添加大标题
document.add_heading("快快乐乐每一天",0)

# 添加段落
p = document.add_paragraph("添加段落的方法")
# 在段落的基础上添加内容 add_run()
run = p.add_run("最新新闻广西百色疫情特别严重,如果是百色的人,注意防护")
run.bold = True # 是否加粗  True表示加粗   False表示不加粗
run.font.size = Pt(18)  # 字体大小设置为18
run.underline = True  # True表示添加下划线  False表示不添加下划线

# 添加一级标题
document.add_heading("一级标题",level=1)
# 添加二级标题
document.add_heading("二级标题",level=2)
# 添加三级标题
document.add_heading("三级标题",level=3)

# 添加带样式的段落
p = document.add_paragraph("带样式的段落",style = "Intense Quote")


# 添加无序列表  style = "List Bullet" 表示无序列表
document.add_paragraph("无序列表第一条数据",style="List Bullet")
document.add_paragraph("无序列表第二条数据",style="List Bullet")
document.add_paragraph("无序列表第三条数据",style="List Bullet")


# 添加有序列表 style = "List Number" 表示有序列表
document.add_paragraph("有序列表第一条数据",style="List Number")
document.add_paragraph("有序列表第二条数据",style="List Number")
document.add_paragraph("有序列表第三条数据",style="List Number")

# 向word文件中添加图片  (注意:图片的路径必须真实存在)
document.add_picture(r"C:\python基础\26-python办公自动化-操作word\resources\meinv.jpg",width=Cm(5.2))

# 向word文件中添加表格
records = (
    ("欣迪","美女","2000-02-11"),
    ("周超","靓仔","2000-03-01"),
    ("文定","猛男","2001-11-14"),
    ("世林","男","1999-04-21"),
    ("俊德","男","1998-03-16")
)

table = document.add_table(rows=1,cols=3)  # rows=1表示从第一行开始
table.style = "Table Grid"  # 表示表格的样式
head_cells = table.rows[0].cells  #添加表格的标题
head_cells[0].text = "姓名"
head_cells[1].text = "性别"
head_cells[2].text = "出生日期"

# 向表格中添加数据
for name,sex,birthday in records:
    row_cells = table.add_row().cells  # 向表格中的每一行添加数据
    row_cells[0].text = name
    row_cells[1].text = sex
    row_cells[2].text = birthday

# 保存文件
document.save("创建word文件.docx")

2、使用python读取word文件

from docx import Document
doc = Document(r"C:\python基础\26-python办公自动化-操作word\resources\离职证明模板.docx")

for no,p in enumerate(doc.paragraphs):  # no表示行号   p表示段落   doc.paragraphs表示文档的所有的段落
    print(no,p.text)   # p.text表示段落的内容

3、python实现批量生成word文件

from docx import Document

# 将员工真实的信息以字典的形式进行保存
person_list = [
    {
        "name":"欣迪",
        "id":"333222444555666999",
        "sdate":"2018年3月1日",
        "edate":"2022年2月10日",
        "department":"技术部",
        "position":"数据分析专家",
        "company":"深圳腾讯科技有限公司"
    },
    {
        "name":"文定",
        "id":"323242464785676954",
        "sdate":"2019年4月11日",
        "edate":"2022年2月15日",
        "department":"行政部",
        "position":"打手",
        "company":"赣州天上人间会所"
    },
    { 
        "name":"周超",
        "id":"643242466485673954",
        "sdate":"2017年5月21日",
        "edate":"2022年2月14日",
        "department":"后厨部",
        "position":"配菜员",
        "company":"深圳金威源餐饮有限公司"
 },
    {
        "name":"李军",
        "id":"443245466455673954",
        "sdate":"2019年8月21日",
        "edate":"2022年2月13日",
        "department":"后勤部",
        "position":"大茶壶",
        "company":"重庆怡红院高级会所"
    }
]

# 对列表进行循环遍历,批量生成word文件
for person in person_list:
    # print(person)
    # 读取离职证明模板文件
    doc = Document(r"C:\python基础\26-python办公自动化-操作word\resources\离职证明模板.docx")
    # 循环遍历模板文件中所有的段落,查找占位符
    for p in doc.paragraphs:
        # print(p.text)
        if "{" not in p.text:
            continue
        # 不能直接修改段落内容,否则会丢失样式,所以需要对段落中的元素进行遍历并进行查找和替换
        for run in p.runs:
            # print(run.text)
            if '{' not in run.text:
                continue
            # 找到占位符的开始位置{ 和结束位置 }  进行内容替换
            start,end = run.text.find("{"),run.text.find("}")
            # print(start,end)
            key,place_holder = run.text[start+1:end],run.text[start:end+1]
            # print(key,place_holder)  # key === >name   place_holder  ==== > {name}

            run.text = run.text.replace(place_holder,person[key])
            # print(run.text)

    # 每个人的信息保存一个word文档
    doc.save(f"{person['name']}的离职证明.docx")

4、import xlrd ,xlwt,random

import xlrd ,xlwt,random
workbook=xlwt.Workbook # 创建Excel表工作薄
xls=workbook.add_sheet("python-2107班级") # 创建Excel表对象
xls.write('shuji','nan',14)
workbook.save("H.xls")

四、PDF

1python读取pdf文件

# 安装 PyPDF2 三方库用于读取pdf文件中的文本
# pip install PyPDF2

import PyPDF2
# 读取pdf文件
reader = PyPDF2.PdfFileReader(r"C:\python基础\28-python办公自动化-操作pdf\test.pdf")
# print(reader)
# 获取指定的页码文本
page = reader.getPage(0)
# 输出当前页码的文本
print(page.extractText())

2通过python旋转pdf文件和创建空白pdf文件

import PyPDF2
# 创建读取pdf文件的对象
reader = PyPDF2.PdfFileReader(r"C:\python基础\28-python办公自动化-操作pdf\XGBoost.pdf")
# 创建写pdf文件的writer对象
writer = PyPDF2.PdfFileWriter()
# 获取pdf文件的所有页码
# print(reader.numPages)   # 13
# 对pdf文件中的所有的页码进行循环遍历
for page_num in range(reader.numPages):
    # 获取当前页码的对象
    current_page = reader.getPage(page_num)
    # 奇数页顺时针旋转90度
    if page_num % 2 != 0:
        current_page.rotateClockwise(90)
    # 偶数页逆时针旋转90度
    else:
        current_page.rotateCounterClockwise(90)
    writer.addPage(current_page)

# 添加空白页面,并且旋转90度
page = writer.addBlankPage()
page.rotateClockwise(90)
# 通过writer对象的write方法将将旋转后的pdf写入到新文件中
with open(r"C:\python07\day19\代码\XGBoost-旋转.pdf","wb") as file:
    writer.write(file)

3通过python对pdf文件进行加密

import PyPDF2
# 创建读取pdf文件的对象
reader = PyPDF2.PdfFileReader(r"C:\python基础\28-python办公自动化-操作pdf\XGBoost.pdf")
# 创建写入pdf文件的对象
writer = PyPDF2.PdfFileWriter()

for page_num in range(reader.numPages):
    # 将原文件的每一页追加到writer对象中去
    writer.addPage(reader.getPage(page_num))

# 给writer对象设置密码
writer.encrypt("123456")
# 创建文件,将加密后的内容写入到新文件中去
with open("C:\python07\day19\代码\XGBoost-加密.pdf","wb") as file:
    writer.write(file)

4通过python对pdf文件添加水印

import PyPDF2

# 读取原pdf文件
reader1 = PyPDF2.PdfFileReader(r"C:\python基础\28-python办公自动化-操作pdf\XGBoost.pdf")
# 读取水印文件
reader2 = PyPDF2.PdfFileReader(r"C:\python基础\28-python办公自动化-操作pdf\watermark.pdf")

# 创建写入pdf文件的对象
writer = PyPDF2.PdfFileWriter()

# 获取水印页
watermark_page = reader2.getPage(0)

for page_num in range(reader1.numPages):
    # 获取当前页对象
    current_page = reader1.getPage(page_num)
    # 将原文件的每一页和水印页合并
    current_page.mergePage(watermark_page)
    writer.addPage(current_page)

# 将添加完水印页的文件写入到新文件中去
with open("C:\python基础\28-python办公自动化-操作pdf\XGBoost-添加水印.pdf","wb") as file:
    writer.write(file)

五、PPT

1.python中的pillow模块

# 安装pillow 模块   pip install pillow
from PIL import Image
# 打开图片 open()
# 显示图片 show()

img_path = r"C:\python基础\27-python办公自动化-操作ppt\resources\11.jpg"
# 打开图片
img = Image.open(img_path)
# 显示图片
# img.show()

# 旋转和翻转图片
'''
rotate() 返回旋转后的新图像,原图片不变,逆时针旋转
save()  保存图片
'''
# img.rotate(45).save("./hehe.jpg")

# 调整图片的大小 resize((width+-数字,height+-数字))   参数:(width+-数字,height+-数字)

# size 表示的是大小
width,height = img.size
print(width,height)

resizeImg = img.resize((width+300,height+150))
resizeImg.save("./调整后的图片.jpg")



2.python操作ppt

from pptx import Presentation

# 创建幻灯片对象
pres = Presentation()
# 选择母版添加一页
tilte_slide_layout = pres.slide_layouts[0]
slide = pres.slides.add_slide(tilte_slide_layout)

# 获取标题栏和副标题栏
title = slide.shapes.title
subtitle = slide.placeholders[1]

# 编辑主标题和副标题
title.text = "welcome to python"
subtitle.text = "Life is short, I use python"


# 选择母版添加一页
bullet_slide_layout = pres.slide_layouts[1]
slide = pres.slides.add_slide(bullet_slide_layout)

# 获取页面上面所有的形状
shapes = slide.shapes
# print(shapes)

# 获取标题和主体
title_shape = shapes.title
body_shape = shapes.placeholders[1]

# 编辑标题
title_shape.text = "介绍"
# 编辑主体内容
tf = body_shape.text_frame
tf.text = "History of Python"

# 添加一个一级段落
p = tf.add_paragraph()
p.text = "hello world"
p.level = 1

# 添加一个二级段落
p = tf.add_paragraph()
p.text = "马上开始"
p.level = 2

# 保存幻灯片
pres.save("测试.pptx")

3.图表

from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches

# create presentation with 1 slide ------
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])

# define chart data ---------------------
chart_data = CategoryChartData()
chart_data.categories = ['East', 'West', 'Midwest']
chart_data.add_series('Series 1', (19.2, 21.4, 16.7))

# add chart to slide --------------------
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
slide.shapes.add_chart(
    XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
)

prs.save('chart-01.pptx')

4.饼图

from pptx import Presentation
from pptx.chart.data import ChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches

chart_data = ChartData()
chart_data.categories = ['West', 'East', 'North', 'South', 'Other']
chart_data.add_series('Series 1', (0.135, 0.324, 0.180, 0.235, 0.126))

chart = slide.shapes.add_chart(
    XL_CHART_TYPE.PIE, x, y, cx, cy, chart_data
).chart

chart.has_legend = True
chart.legend.position = XL_LEGEND_POSITION.BOTTOM
chart.legend.include_in_layout = False

chart.plots[0].has_data_labels = True
data_labels = chart.plots[0].data_labels
data_labels.number_format = '0%'
data_labels.position = XL_LABEL_POSITION.OUTSIDE_END

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蘑菇Ms程序化

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值