办公自动化 ---->利用python发邮件
加载工作簿:load_workbook
import openpyxl
workbook = openpyxl.load_workbook('resources/阿里巴巴2020年股票数据.xlsx')
获取工作表
1)只有一个工作表的时候
sheet = workbook.active
2)打印所有的工作簿
for sheet in workbook.worksheets:
print(sheet.title)
3)拿第一个工作表
sheet = workbook.worksheets[0]
获取工作表的属性
sheet = workbook['Sheet1'] # type.Worksheet
# 代码后面的类型注释可以让PyCharm在后面的代码中为sheet对象提示属性和方法
print(sheet.max_row, sheet.max_column)
print(sheet.dimension)
操作单元格
cell = sheet['E5'] # type:Cell
cell = sheet.cell(5, 5)
print(cell.value) # 获取单元格的值
# 给单元格重新赋值
# 法1
cell.value = 200
# 法2
sheet.cell(5, 5, 300) # 将第5行第5列的值改变
循环遍历所有单元格
for row in range(2, sheet.max_row+1):
for col in range(1, sheet.max_column+1):
value = sheet.cell(row, col).value
if isinstance(value, float):
print(f'{value:.2f}', end='\t')
elif isinstance(value, int):
print(f'{value:>10.2f}', end='\t')
elif type(value) == datetime:
print(value.strftime('%Y/%m/%d'), end='\t')
else:
print(value, end='\t')
print()
公式计算
sheet['E256'] = '=avergae(e2:e255)'
sheet['F256'] = '=sum(f2:f255)'
# 修改对齐方式以及字体
cell = sheet['F257']
cell.value = '加油'
cell.alignment=Alignment(horizontal='center', vertical='center')
cell.font = Font(name='华文行楷', size=20, color='000099')
# 修改边框的样式
side = Side(color='000099', style='mediumDashed')
cell.border = Border(left=side, right=side, top=side, bottom=side)
# 修改行高和列宽
sheet.row_dimensions[257].height = 70
sheet.colum_dimension['F'].width = 20
插入图表
# 绘制折线
c1 = LineChart()
c1.title = '一月份收盘价和开盘价'
c1.style = 13
c1.y_axis.title = '价格'
c1.x_axis.title = '日期'
# 给图添加数据引用(纵轴数据)
data = Reference(sheet, min_col=4, max_col=5, min_row=2, max_row=23)
c1.add_data(data, titles_from_data=True)
# 设置横轴数据
cats = Reference(sheet, min_col=1, min_row=2, max_row=23)
c1,set_categories(cats)
# 给数据系列设置样式
s1 = c1.series[0]
s1.marker.symbol = 'triangle'
# 标记点的填充色
s1.marker.graphicalProperties.solidFill = '000099'
# 设置标记点的边框色
s1.marker.graphicalProperties.line.solidFill = '0000ff'
# 将曲线设置为平滑曲线
s1.smooth = True
# 将图添加到工作表
sheet.add_chart(c1, 'A258')
# 保存工作薄
workbook.save('resources/阿里巴巴2020年股票数据.xlsx')
利用python发邮件
邮件服务器 --》自己搭建,或者买三方邮件服务
发邮件:SMTP ---》简单邮件传输协议 ---》通过这个协议跟自己的邮件服务器进行网络通信
Python标准库已经对SMTP进行了封装,我们主要通过创建对象,通过给对象发消息的方式就可以完成邮件发送
smtplib模块 --》SMTP_SLL --》login()/ sendmail/quit()
MIME ---> Multi-purpose(多用途) Internet Mail Extension
---> text/html 超文本
---> image/png
---> image/gif
---> audio/mp3
---> video/mp4
---> application/pdf
MIMEMultipart --> attach -->添加文本,附件等其他内容
MIMEMText ---> 既可以封装文本也可以封装二进制数据(需要经过BASE64编码处理)
收邮件:1)POP3 -->邮局协议第三版
2)IMAP -->网络传输协议
# 没有附件的邮件发送格式
import smtplib
from email.mime.text import MIMEText
# 创建SMTP_SSL对象
smtp_obj = smtplib.SMTP_SLL(host='smtp.qq.com', port=465)
# 1.登录授权
smtp_obi.login(本机邮箱账号,服务器给的授权码)
# 文件内容
content = """
武侯区明天小雨,出门记得带伞
"""
# MIMEText对象的构建以及文件标题等
mime_text = MIMEText(content, 'plain', 'utf-8')
mime_text['From'] = 发件人账号
mime_text['To'] = 收件人账号(多个收件的的时候中间用分号隔开)
mime_text['Subject'] = 邮件主题
# 2、发送邮件
stmp_obj.sendmail(
# 发件人
from_addr=发件人邮箱账号
# 收件人
to_addrs=收件人邮箱账号,多个账号的时候中间用逗号隔开
# 邮件内容,调用MIMEText对象的as_string()方法,将邮件主体转换成字符串作为第三个参数
msg=mime_text.as_string()
)
# 结束会话
smtp_obj.quit()
给邮件添加附件
import smtplib
from email.mime.multipart import MIMEMutipart
from email.mime.text import MIMEText
# 创建SMTP_SSL对象
smtp_obj = smtplib.SMTP_SSL(host=邮件服务器地址, port=安全的SMTP默认465端口)
# 1、授权登录
smtp_obj.login(发件人邮箱地址,服务器给的授权码)
# 文件正文
content = """
万里晴空
"""
MIMEMultipart()添加附件
m_part = MIMEMultipart()
m_part['From'] = 发件人邮箱地址
m_part['To'] = 收件人地址(人比较多的时候中间用分号隔开)
m_part['Cc'] = '....;....;.....;....'
m_part['Subject'] = 邮件主题
mime_text = MIMEText(content, 'plain', 'utf-8')
m_part.attach(mime_text)
# 添加附件
with open('resources/Base64 - 维基百科,自由的百科全书.pdf', 'rb') as file:
pdf_file = MIMEText(file.read(), 'base64', 'utf-8')
# 确定附件内容的类型
pdf_file['content-type'] = 'application/pdf'
# 在文本协议里面需要处理成百分号编码
# 设置内容的处置方式(可下载的附件)
pdf_file['content-disposition']='attachment;filename="aaa.pdf"'
m_part.attach(pdf_file)
with open('resources/阿里巴巴2020年股票数据.xlsx', 'rb') as file:
excel_file=MIMEText(file.read(), 'base64', 'utf-8')
excel_file['content-type']='application/vnd.ms-excel'
excel_file['content-disposition']= 'attachment;filename="alibb-stock.xlsx"'
m_part.attach(excel_file)
smtp_obj.sendmail(
from_addr=发件人邮箱
to_addrs = 收件人邮箱(如果有多个,他们中间用分号隔开)
msg=m_part.as_string()
)
# 结束会话
smtp_obj.quit()
百分号编码
将字符串处理成百分号编码quote(将中文处理成百分号编码)/unquote(将百分号编码转换成中文)
filename = quote('中文')
f'attachment; filename={filename}'
f"attachment; filename *=utf-8''{filename}"
在邮件里面添加html格式的内容
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import requests
smtp_obj = smtplib.SMTP_SSL(host=本机服务器,port=安全的端口)
smtp_obj.login(本机账户,授权码)
m_part = MIMEMultipart()
m_part['From'] = 发件人账户
m_part['To'] = 收件人账户
m_part['Subject'] = 邮件主题
content="""
<p>晴空万里</p>
<img src=网络图片地址>
"""
resp = requests.get(要查看的网页地址)
html_page = MIMEText(resp.text + content, 'html', 'utf-8')
m_part.attach(html_page)
smtp_obj.sendmail(
from_addr=发件人账户,
to_addrs=收件人账户,
msg=m_part.as_string()
)
smtp_obj.quit()
调用三方短信网关-使用python发短信
HTTP ---》 请求方法 ---》 GET(从服务器拿数据)/POST(发数据给服务器)
import requests
def send_message(tel, message):
resp=requests.post(
url=第三方短信网关地址,
auth=('api','授权码'),
data={
'mobile':tel,
'message':message
},
timeout=3,
verify=False
)
return resp.json()
只有在IP白名单中的地址,才能调短信网关发送短信
用python操作PDF文件
如果要从PDF文件中抽取中文,建议直接使用光学文字识别(OCR)
pip install easyocr
生成依赖项清单
pip freeze > requirements.txt(读取依赖项清单文件,安装依赖项) ---> 输出重定项
pip uninstall -y -r requirements.txt - > 将requirements.txt安装的一条一条删掉
python实现pdf转图片
def get_filename(file_path):
"""
获取不带路径和后缀的文件名
:param file_path: 文件路径
:return:
"""
_, fullname = os.path.split(file_path)
# 获取文件名和后缀
filename, _ = os.path.splitext(fullname)
return filename
def pdf_image(pdf_file, img_file, zoom_x=3, zoom_y=3, rotation_angle=0):
"""
将PDF文件转成PNG图片
:param pdf_file: PDF文件路径
:param img_file: 保存图片的路径
:param zoom_x: 缩放比例(横向)-》决定图的质量,值越大处理起来越慢,但是图的质量越好
:param zoom_y: 缩放比例(纵向)
:param rotation_angle: 旋转角度
:return:
"""
# 打开PDF文件
pdf = fitz.open(pdf_file)
# 逐页读取PDF
for page_num in range(0, pdf.pageCount):
page = pdf[page_num]
# 设置缩放和旋转系数
# 创建用于图像变换的矩阵
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
# 将PDF页面处理成图像
pm = page.getPixmap(matrix=trans, alpha=False)
# 开始写图像
temp = get_filename(pdf_file) # 根据pdf的文件名,给生成的图片取名字
# 图片输出格式
pm.writePNG(f'{img_file}{temp}_{page_num + 1}.png')
pdf.close()
def main():
# 如果没有则添加文件目录
if not os.path.exists('resources/images/'):
os.makedirs('resources/images/')
pdf_image('resources/XGBoost.pdf', 'resources/images/')
if __name__ == '__main__':
main()
给pdf文件加空白页或者将页面进行旋转
import PyPDF2
from PyPDF2.pdf import PageObject
reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf')
writer = PyPDF2.PdfFileWriter()
# 可以查看一共有多少页
for page_num in range(reader.getNumPages()):
# 从reader里面拿到获取到的每一页
page_obj = reader.getPage(page_num) # type: PageObject
# 顺时针旋转90度
page_obj.rotateClockwise(90)
# 将旋转后的图片写入新的文件
writer.addPage(page_obj)
# 添加空白页
blank_age = writer.addBlankPage() # type: PageObject
blank_age.rotateClockwise(90)
# pdf文件设置密码(口令)
writer.encrypt('TingTingZi')
# 将writer写入文件
with open('resources/XGBoost_modified.pdf', 'wb') as file:
writer.write(file)
加水印
import PyPDF2
from PyPDF2.pdf import PageObject
# 读取水印文件
reader = PyPDF2.PdfFileReader('resources/watermark.pdf')
wm_page = reader.getPage(0)
# 读取需要添加水印的文件
reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf')
# 创建Pdf 文件
writer = PyPDF2.PdfFileWriter()
# 遍历文件所有页面,然后往里面添加水印
for page_num in range(reader.getNumPages()):
page_obj = reader.getPage(page_num) # type: PageObject
# 加水印页
page_obj.mergePage(wm_page)
# 将合并之后的页添加到新创建的pdf文件中
writer.addPage(page_obj)
# 保存添加完水印之后pdf文件
with open('resources/XGBoost_watermarked.pdf', 'wb') as file:
writer.write(file)
创建pdf文件
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfgen import canvas
# 创建画布
pdf_canvas = canvas.Canvas('resources/demo.pdf', pagesize=A4)
width, height = A4
# 绘图
# image = canvas.ImageReader('girl01.jpg')
# pdf_canvas.drawImage(image, 20, height - 395, 250, 200)
# pdfmetrics.registerFont(TTFont('Font2', 'resources/青呱石头体.ttf'))
# pdf_canvas.setFont('Font2', 40)
# # 设置颜色, 1 是透明度为不透明, 透明度是0.2
# pdf_canvas.setFillColorRGB(0.9, 0.5, 0.3, 0.3)
# 书写文字
# pdf_canvas.drawString(width // 2 - 120, height // 3, '我心向阳!!!')
# pdf_canvas.rotate(36)
#
# # 显示当前页
# pdf_canvas.showPage()
# 注册字体文件
pdfmetrics.registerFont(TTFont('Font1', 'resources/dd.ttf'))
pdfmetrics.registerFont(TTFont('Font2', 'resources/青呱石头体.ttf'))
# 写字
pdf_canvas.setFont('Font2', 40)
# 设置颜色, 1 是透明度为不透明, 透明度是0.2
pdf_canvas.setFillColorRGB(0, 200, 0, 0.1)
# 书写文字
# pdf_canvas.drawString(width // 2 - 120, height // 3, '你好,世界!')
pdf_canvas.rotate(36)
pdf_canvas.drawString(400, 250, 'Python学习!!!')
# pdf_canvas.setFont('Font1', 40)
# pdf_canvas.setFillColorRGB(0, 1, 0, 0.5)
# 显示当前页
pdf_canvas.showPage()
# pdf_canvas.setFillColorRGB(0, 2, 3, 0.4)
# # 将字体旋转18度
# pdf_canvas.rotate(18)
# pdf_canvas.drawString(250, 250, 'hello, world!')
# 保存
pdf_canvas.save()