Python自动化

本文介绍了使用Python进行文件和文件夹的管理,包括路径操作、文件信息获取、遍历文件等。接着讲解了如何操作Excel表格,如读取、写入、公式、样式设置等。还涉及PDF文件的读取、分割、合并、水印和加密。此外,介绍了Word文档的创建、编辑以及设置文字样式。最后提到了PPT处理和邮件、社交机器人自动化操作的基本方法。
摘要由CSDN通过智能技术生成

Python自动化

管理文件及文件夹

import os

# 获取当前python程序运行路径

print(os.getcwd())


#不同系统,文件分割符不同;路径拼接

print(os.path.join('project','python'))


# 列出当前程序文件夹下的所有文件和文件夹;可以指定参数:路径

print(os.listdir())


# 判断是否是文件夹

files = os.listdir()

for file in files:

    print(os.path.isdir(file))

    

# 输出文件信息

# os.scandir(指定路径)

# 文件信息属性

#	st_size:文件的大小单位bytes

#	st_atime:最近访问时间

#	st_mtime:最近修改时间

#	st_ctime:windows下的创建时间

#	st_birthtime:Mac,Linux表示创建时间

for file in os.scandir():

    print(file.name,file.path,file.is_dir())

    print(file.stat())

    

    

# 把文件夹里的文件夹里的文件都找出来

# os.walk(指定路径)

for dirpath,dirnames,files in os.walk('./'):

# dirpath 文件夹路径

# dirnames 是 dirpath 这个文件夹下的子文件夹列表

# files 是dirpath这个文件夹里的文件列表


import glob

# **任意层文件或文件夹;recursive=True会不断进入文件夹内

print(glob.glob('**/*.py',recursive=True))


# 匹配文件名

import fnmatch

print(fnmatch.fnmatch('less1.py','le*[0-9].py'))


# 查询指定文件

print(os.stat('less.py'))



# 创建临时文件存储数据;程序运行完成后会自动删除临时文件

from tempfile import TemporaryFile

# w+ 写入及读取

f = TemporaryFile('w+')

f.write('hello')

# 回到文件开头位置

f.seek(0)

data = f.readlines()

print(data)

f.close()


# 创建临时文件夹

from tempfile import TemporaryDirectory


with TemporaryDirectory() as tmp_folder:

    print(f'临时文件夹以创建:{tmp_folder}')

    

    

# 创建文件夹

# 判断是否已存在

if not os.path.exists('新文件夹'):

    # 不存在则创建

    os.mkdir('新文件夹')

# 创建多层文件夹    

os.makedirs('1/2/3')



# 复制文件

import shutil

# 复制文件

shutil.copy('filw1.txt','./新文件夹/newFile.txt')

#复制文件夹
shutil.copytree('文件夹','新文件夹')
# 移动文件
shutil.move('fileq.txt','路径')
#重命名文件
os.rename('文件','新的文件')
#删除文件,只能是文件
os.remove('file.txt')
# 删除文件夹
shutil.rmtree('文件夹')


# 读取压缩包内文件
import zipfile

with zipfile.ZipFile('压缩问价.zip', 'r') as zipobj:
    # 将压缩包内单个文件解压出来
    zipobj.extract('要解压的文件名', '位置', '密码')
    for file_name in zipobj.namelist():
        # 处理压缩包中的中文
        print(file_name.encode('cp437').decode('gbk'))
        # 读取压缩包内文件信息
        info = zipobj.getinfo(file_name)
        
 # 创建压缩包      
file_list = ['1.py','2.py']
with zipfile.ZipFile('创建的压缩包.zip','w') as zipobj:
    for file in file_list:
        zipobj.write(file)
 # 向已有的压缩包内添加文件
with zipfile.ZipFile('创建的压缩包.zip','a') as zipobj:
    zipobj.write('待追加的文件名')

操作Excel表格

# 使用openpyxl模块
# pip install openpyxl
from openpyxl import load_workbook
# 打开已经存在的excel文件
workbook = load_workbook(file_name='文件.xlsx')
# 获取表格文件内的sheet名称
print(workbook.sheetnames)
# 根据sheet名称获取sheet
sheet = workbook['sheet名称']
# 获取表格最大尺寸
print(sheet.dimensions)
# 打开活跃的、唯一的表格
sheet1 = workbook.active
# 获取A1单元格
cell = sheet1['A1']
# 获取单元格的值
print(cell.value)
# 所在行
print(cell.row)
# 所在列
print(cell.column)
# 坐标
print(cell.coordinate)
# 用行数和列数定位某个单元格
cell1 = sheet1.cell(row=1,column=1)

# 获取一些列单元格
cells = sheet1['A1:A5']
# 获取指定列的单元格
cell_column = sheet1['A']
# 获取指定行的单元格
cells_row = sheet1['1']

# 指定行和列的范围,按行获取
for row in sheet1.iter_rows(min_row,max_row,min_col,max_col):
    print(row)

# 迭代整个表格的所有行
for row in sheet1.rows:
    print(row)


# 向某个格子写入内容并保存
workbook = load_workbook(file_name='文件.xlsx')
sheet1 = workbook.active
sheet1['A1'] = 'hello'
workbook.save(file_name='文件.xlsx')


cell = sheet1['A1']
cell.value = 'hello'
workbook.save(file_name='文件.xlsx')


# 列表插入一行
workbook = load_workbook(file_name='文件.xlsx')
sheet1 = workbook.active
data = [
    ['a',1],
    ['b',2],
    ['c',3],
    ['d',4],
]
for row in data:
    # 在表格已有数据后面插入;row 是列表,插入是一行数据
    sheet1.append(row)
workbook.save(file_name='文件.xlsx')


# 插入公式
workbook = load_workbook(file_name='文件.xlsx')
sheet1 = workbook.active
sheet1['F1002'] = '=AVERAGE(F2:F1001)'
workbook.save(file_name='文件.xlsx')

# 查看openpyxl支持的公式
from openpyxl.utils import FORMULAE

print(FORMULAE)




# 打开已经存在的excel文件
workbook = load_workbook(file_name='文件.xlsx')
# 打开活跃的、唯一的表格
sheet = workbook.active

# 插入列;在idx列的左边插入amount列
sheet.insert_cols(idx=2,amount=5)
# 从idx这列开始删除amount列,包括idx这一列
sheet.delete_cols(idx=2,amount=5)

# 插入行,在idx上面插入amount行
sheet.insert_rows(idx=2,amount=5)
# 从idx这行开始删除amount行,包括idx这一行
sheet.delete_rows(idx=2,amount=5)

# 移动格子;证书向下或者向右,负数向上或者向左
sheet.move_range('C1:D4',rows=2,cols=-2)

#  创建新的sheet
workbook.create_sheet('sheet名称')
# 删除sheet
workbook.remove('sheet名称')
# 复制sheet
sheet1 = workbook['sheet1']
workbook.copy_worksheet(sheet1)
# 修改sheet名称
sheet1.title = '表格2'
workbook.save(file_name='文件.xlsx')


# 创建新的Excel文件
from openpyxl import Workbook
workbook = Workbook()
sheet = workbook.active
sheet.title = '表格'
workbook.save(file_name='新文件.xlsx')


# 打开已经存在的excel文件
workbook = load_workbook(file_name='文件.xlsx')
# 打开活跃的、唯一的表格
sheet = workbook.active
# 冻结窗格;G2表示G前面的列,2上面的行被冻结
sheet.freeze_panes = 'G2'
# 添加筛选
sheet.auto_filter.ref = sheet.dimensions
workbook.save(file_name='文件.xlsx')


# 字体
from openpyxl.styles import Font
# 设置对齐样式
from openpyxl.styles import Alignment
# 设置边框样式
from openpyxl.styles import Side,Border
# 填充样式
from openpyxl.styles import PatternFill,GradientFill



# 打开已经存在的excel文件
workbook = load_workbook(file_name='文件.xlsx')
sheet = workbook.active

cell = sheet['A1']
font = Font(name='字体名称',size='字体大小',bold='是否加粗',italic='是否斜体',color='颜色')
cell.font = font

alignment = Alignment(horizontal='水平对齐方式',vertical='垂直对齐方式',text_rotation='旋转角度',wrap_text='是否自动换行')
cell.alignment = alignment

side = Side(style='边线样式',color='颜色')
cell.side = side
border = Border(left='左线样式',right='右',top='上',bottom='下')
cell.border = border

pattern_fill = PatternFill(fill_type='填充样式',fgColor='颜色')
cell.fill = pattern_fill

cell2 = sheet['A2']
gradient_fill = GradientFill(stop=('渐变颜色1','渐变颜色2',...))
cell2.fill = gradient_fill

# 设置行高,列宽
sheet.row_dimensions[行编号].height = 行高
sheet.column_dimensions[列编号].width = 列宽

# 合并单元格
sheet.merge_cells('C1:D2')
sheet.merge_cells(start_row=7,start_column=1,end_row=8,end_column=4)

# 取消合并单元格
sheet.unmerge_cells('C1:D2')
sheet.unmerge_cells(start_row=7,start_column=1,end_row=8,end_column=4)

workbook.save(file_name='文件.xlsx')



# 插入图片
from openpyxl import load_workbook
from openpyxl.drawing.image import Image

# 打开已经存在的excel文件
workbook = load_workbook(file_name='文件.xlsx')
sheet = workbook.active

logo = Image("xx.png")
logo.height=100
logo.width=100

sheet.add_image(logo,'C1')
workbook.save(file_name='文件.xlsx')



# 插入柱状图
from openpyxl import load_workbook
from openpyxl.chart import BarChart,Reference

# 打开已经存在的excel文件
workbook = load_workbook(file_name='文件.xlsx')
sheet = workbook.active

chart = BarChart()
# 指定生成图表的数据引用范围
data = Reference(worksheet=sheet,min_row=1,max_row=7,min_col=2,max_col=3)
# 设定X轴项目名称
categories = Reference(worksheet=sheet,min_row=2,max_row=7,min_col=1)
# 给图表添加数据,titles_from_data=True数据源含中有标题
chart.add_data(data,titles_from_data=True)
# 设定X周类目
chart.set_categories(categories)
sheet.add_chart(chart,"E2")

workbook.save(file_name='文件.xlsx')


# 插入条形图
from openpyxl import load_workbook
from openpyxl.chart import LineChart,Reference

# 打开已经存在的excel文件
workbook = load_workbook(file_name='文件.xlsx')
sheet = workbook.active

chart = LineChart()
# 指定生成图表的数据引用范围
data = Reference(worksheet=sheet,min_row=1,max_row=7,min_col=2,max_col=3)
# 设定X轴项目名称
categories = Reference(worksheet=sheet,min_row=2,max_row=7,min_col=1)
# 给图表添加数据,titles_from_data=True数据源含中有标题;from_rows=True数据排向
chart.add_data(data,from_rows=True,titles_from_data=True)
# 设定X周类目
chart.set_categories(categories)
sheet.add_chart(chart,"E2")

workbook.save(file_name='文件.xlsx')

操作PDF

# pip install pypdf2
# pip install pdflumber


import pdflumber

with pdflumber.open('pdf路径') as pdf:
    first_page = pdf.pages[页数]
    # 提取pdf文字
    print(first_page.extract_text())
    # 提取简单表格
    print(first_page.extract_table(
        # 提取表格时的设定
        table_settings={
            "vertical_strategy":"text",
            "horizontal_strategy":"text"
        }
    ))

# 分割,合并pdf
from PyPDF2 import PdfFileReader,PdfFileWriter
pdf_reader = PdfFileReader('pdf路径')
# 分割pdf
for page in range(pdf_reader.getNumPages()):
    pdf_writer = PdfFileWriter()
    # .rotateClockwise(90的倍数),顺时针旋转90度
    page = pdf_reader.getPage(page).rotateClockwise(90)
    # .rotateCounterClockwise(90的倍数),逆时针旋转90度
    page = pdf_reader.getPage(page).rotateCounterClockwise(90)
    pdf_writer.addPage(page)
    with open(f'./分割后的PDF文件/{page}.pdf','wb') as out:
        pdf_writer.write(out)

# 合并pdf
pdf_writer = PdfFileWriter()
for page in range(16):
    pdf_reader = PdfFileReader(f'./分割后的PDF文件/{page}.pdf','wb')
    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))
with open('xxx.pdf','wb') as out:
    pdf_writer.write(out)


# 合并PDF水印
from PyPDF2 import PdfFileReader,PdfFileWriter
from copy import copy

watermark_pdf = PdfFileReader('水印.pdf')
watermark_page = watermark_pdf.getPage(0)

pdf_reader = PdfFileReader('xx.pdf')
pdf_writer = PdfFileWriter()


for page in range(pdf_reader.getNumPages()):
    original_page = pdf_reader.getPage(page)
    new_page = copy(watermark_page)
    # 下面的内容.mergePage(上面的内容)
    new_page.mergePage(original_page)
    pdf_writer.addPage(new_page)
with open('watermarked.pdf','wb') as out:
    pdf_writer.write(out)


# 加密PDF
from PyPDF2 import PdfFileReader,PdfFileWriter

pdf_reader = PdfFileReader('xx.pdf')
pdf_writer = PdfFileWriter()

for page in range(pdf_reader.getNumPages()):
    pdf_writer.addPage(pdf_reader.getPage(page))

#    加密
pdf_writer.encrypt('密码')
with open('encrypted.pdf','wb') as out:
    pdf_writer.write(out)

# 解密
pdf_reader = PdfFileReader('encrypted.pdf')
pdf_reader.decrypt('密码')

pdf_writer = PdfFileWriter()

for page in range(pdf_reader.getNumPages()):
    pdf_writer.addPage(pdf_reader.getPage(page))

with open('encrypted.pdf','wb') as out:
    pdf_writer.write(out)

操作Word

  • Document 文档
  • Paragraph 段落
  • Run 文字块
# coding:utf-8


# pip install python-docx

from docx import Document

doc = Document('word.docx')
# 得到一个列表,包含了每个段落实例
print(doc.paragraphs)

for paragraph in doc.paragraphs:
    # 段落对应文字内容
    print(paragraph.text)
    # 得到一个列表,包含了每个文字块
    runs = paragraph.runs
    print(runs)

# 向word文档写入内容

doc = Document()
# 添加一级标题
doc.add_heading('一级标题',lecel=1)
# 添加段落
paragraph1 = doc.add_paragraph('段落文字内容')
# 添加文字块
paragraph1.add_run('加粗').bold=True
paragraph1.add_run('普通')
paragraph1.add_run('斜体').italic=True

# 添加分页
doc.add_page_break()

# 图片宽高
from docx.shared import Cm
# 添加图片
doc.add_picture('图片地址',width=Cm(5),height=Cm(5))

# 添加表格
records = [
    ['编号','姓名','成绩'],
    [1,'li',50],
    [2,'cc',90],
]
table = doc.add_table(rows=3,cols=3)
for row in range(3):
    cells = table.rows[row].cells
    for col in range(3):
        cells[col].text=str(records[row][col])




# 对文字字体样式进行修改
from docx.shared import Pt,RGBColor
from docx.oxml.ns import qn
# 对齐方式
from docx.enum.text import WD_ALIGN_PARAGRAPH

for paragraph in doc.paragraphs:
    for run in paragraph.runs:
        run.font.bold=True
        run.font.italic=True
        run.font.underline=True
        run.font.strike=True
        run.font.shadow=True
        run.font.size=Pt(20)
        run.font.color.rgb=RGBColor(255,255,255)

        run.font.name='微软雅黑'
        r = run._element.rPr.rFonts
        r.set(qn('w:eastAsia'),'微软雅黑')

    paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
    # 设置行间距,浮点数,2.0表示两倍行间距
    paragraph.paragraph_format.line_spacing = 2.0
    # 段前与段后间距,Pt(12) 12磅
    paragraph.paragraph_format.space_before = Pt(12)
    paragraph.paragraph_format.space_after = Pt(12)



doc.save('保存路径')

操作PPT


# pip install python-pptx


# Slide     幻灯片页
# Shape     形状
# Paragraph 段落
# Run       文字块

from pptx import Presentation

prs = Presentation('xx.pptx')
# 每个slide
for slide in prs.slides:
    # 每个形状
    for shape in slide.shapes:
        # 是否有文字
        if shape.has_text_frame:
            # 获取文字框
            text_frame = shape.text_frame
            # 获取 shape中的段落
            for paragraph in text_frame.paragraphs:
                print(paragraph.text)

# prs.slide_layouts[0]  获取第一个模板
slide = prs.slides.add_slide(prs.slide_layouts[0])

# 获取每个占位符
for shape in slide.placeholders:
    phf = shape.placeholder_format
    print(f'{phf.idx}--{shape.name}--{phf.type}')
    # 向占位符内填写内容
    shape.text = f'{phf.idx}--{phf.type}'

# 向一号占位符内填写内容
slide.placeholders[0].text = 'aaaaa'


prs.save('文件路径')

处理邮件

  • 发邮件

# yagmail 模块,发邮件模块,SMTP包
# keyring  访问系统秘钥,存储密码
# schedule  定时执行器
# imbox  IMAP相关操作
# pip install yagmail keyring schedule imbox

# SMTP:邮件传输协议
# IMAP:交互式邮件存取协议

# 频繁发送邮件可能会被当做垃圾邮件屏蔽
# 注册邮箱,开通POP3/SMTP/IMAP

# python 控制台存入密码
'''
import yagmail
# 存入发件人邮箱地址和密码
yagmail.register('邮箱','密码')
'''


import yagmail
yag = yagmail.SMTP(user='发件人邮箱',host='SMTP服务器域名')
contents = [
    '内容1',
    '内容2',
    # 带HTML样式的邮件
    '<a href="https://www.runoob.com/docker/docker-tutorial.html>菜鸟</a>',
    # 发送附件
    '文件路径',
    # 发送嵌入图片邮件
    yagmail.inline('图片路径')

]
# 发送单人
yag.send('收件人邮箱','主题',contents)
# 群发邮件
yag.send(['收件人邮箱','收件人邮箱','收件人邮箱'],'主题',contents)


# 定时发送邮件
import schedule
import time

def job():
    print('发邮件')

#     定义任务
schedule.every().minutes.do(job)
schedule.every(10).minutes.do(job)
schedule.every().minutes.at(":17").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)
  • 读取邮件


# python 控制台存入密码
'''
import yagmail
# 存入发件人邮箱地址和密码
yagmail.register('邮箱','密码')
'''


import keyring
import datetime
from imbox import Imbox

# 读取yagmail全局存入的邮箱密码
password = keyring.get_password("yagmail","要读取密码的邮箱")

# 163、126邮箱,要提前配置允许第三方客户端读取内容

with Imbox('imap服务器地址','要读取的邮箱',password,ssl=True) as imbox:
    # 读取全部邮件
    all_inbox_messages = imbox.messages()
    # 获取未读邮件
    unread_inbox_messages = imbox.messages(unread=True)

   #  红旗邮件
   # imbox.messages(flagged=True)

   #  指定发件人的邮件
   #  imbox.messages(send_from='发件人邮箱')

   #  某收件人邮件
   #  imbox.messages(send_to='收件人邮箱')

   #  lt 某天前;gt 某天后;on 某一天
   # imbox.messages(date_lt=datetime.date(2023,2,10))
   #  imbox.messages(date_gt=时间)
   #  imbox.messages(date_on=时间)
    # uid 邮件唯一标识,message邮件内容
    for uid,message in all_inbox_messages:
        print(message.subject)
        print(message.body['plain'])
        # 标记已读
        imbox.mark_seen(uid)
        # 删除邮件
        imbox.delete(uid)

#全部邮件
    all_inbox_messages = imbox.messages()
    # 获取未读邮件
    unread_inbox_messages = imbox.messages(unread=True)

   #  红旗邮件
   # imbox.messages(flagged=True)

   #  指定发件人的邮件
   #  imbox.messages(send_from='发件人邮箱')

   #  某收件人邮件
   #  imbox.messages(send_to='收件人邮箱')

   #  lt 某天前;gt 某天后;on 某一天
   # imbox.messages(date_lt=datetime.date(2023,2,10))
   #  imbox.messages(date_gt=时间)
   #  imbox.messages(date_on=时间)
    # uid 邮件唯一标识,message邮件内容
    for uid,message in all_inbox_messages:
        print(message.subject)
        print(message.body['plain'])
        # 标记已读
        imbox.mark_seen(uid)
        # 删除邮件
        imbox.delete(uid)


image-20230302221119643

微信机器人

image-20230302222048117

QQ机器人

image-20230302222530412

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值