第五周总结
1.万能键设置:file --> setting --> keymap --> codecompletion --> basic将原来的删除,设置一个没有用过的键用于后面的代码提示按键。
2.设置一个简单的窗口程序:(也可以看预科笔记)
from PyQt5.OtWidgets import QApplication, QWiget, QPushButton
app = QApplication(sys.argv)
# 创建窗口
window = QWidget()
window.resize(800, 600) # 设置窗口大小
# 设置窗口标题
window.setWindowTitle('My First App')
# 设置按钮
button = QPushButton('Hit me', window)
button.resize(80, 30)
button.move(100, 100)
button.clicked.connected(app.quit) # 按钮关联事件
# 点击执行
window.show()
sys.exit(app.exec())
3.在网页上生成你想要的数据图像(如柱形图,饼图等等)
pyecharts 学习网站:https://pyecharts.org/#/zh-cn/
# 首先要安装pyecharts三方库 - pip install pyecharts
from pyecharts.chart import Bar
bar = Bar()
# 条形图x轴的分类
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
bar.add_yaxis("商家B", [15, 21, 13, 30, 55, 99])
bar.add_yaxis("商家C", [56, 23, 78, 90, 78, 45])
# render 会生成本地HTML文件,默认会在当前目录生成render.html文件,也可以传入路径参数,如bar.render("mycharts.html")
bar.render('sales.html')
4.用python发送短信
"""
HTTP
邮件服务器 --> 自己搭建 / 买三方邮件服务
SMTP --> Simple Mail Transfer Protocol - 简单邮件传输协议 -- 跟你的邮件服务器进行网络通信
Python标准库已经对SMTP进行了封装,我们主要通过创建对象, 给对象发消息的方式就可以完成邮件的发送
smtplib模块 --> SMTP_SSL --> login() / sendmail() / quit()
邮件服务器 : smtp.qq.com 端口:465 / 25
账号:发件人的邮箱账号
授权码:开启POP3 / SMTP 服务获取授权码
MIMEMultipart --> attach --> 添加文本、附件等其他内容
MIMEText --> 可以用来封装文本内容、也可以封装二进制数据(需要经过BASE64编码处理)
"""
from email.mime.text import MIMEText
import smtplib
# 创建SMTP_SSL对象(host=邮件服务器地址, port=安全的SMTP端口,默认是465端口)
smtp_obj = smtplib.SMTP_SSL(host='smtp.qq.com', port=465)
# 1登录授权 - smtp_obj.lojin(用户名, 授权码)
smtp_obj.lojin('3465600450@qq.com', '授权码')
# 邮件内容
content = """在前⾯的课程中,我们已经教会⼤家如何⽤Python程序⾃动的⽣成Excel、Word、PDF⽂档,接下来我们还可以更
进⼀步,就是通过邮件将⽣成好的⽂档发送给指定的收件⼈,然后⽤短信告知对⽅我们发出了邮件。这些事情利⽤
Python程序也可以轻松愉快的解决。"""
# 邮件主体内容通过MIMEText对象构造
mime_text = MIMEText(content, 'plain', 'utf-8') # plain 代表纯文本内容
# 邮件发件人
mime.text['From'] = '3465600450@qq.com'
# 邮件收件人
mime.text['To'] = '2873556689@qq.com;1454810474@qq.com'
# 邮件主题
mime_text['Subject'] = 'Python办公自动化学习内容'
# 2.发送邮件
"""
sendmail 方法的三个重要参数
from_addr - 发件人,跟上面的mime_text['From']保持一致
To_addrs - 收件人,可以是多个,跟上面的mime_text['To']保持一致
msg - 邮件内容
"""
# 调用MIMEText对象的的as_string()方法,将邮件主体转换成字符串作为第三个参数
smtp_obj.sendmail(
from_addr='3465600450@qq.com',
to_addrs=['2873556689@qq.com', '1454810474@qq.com'],
msg=mime_text.as_string()
)
# 3.结束会话
smtp_obj.quit()
# 发送邮件时添加附件方式(代码如下)
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from urllib.parse import quote
import requests
# 创建SMTP_SSL对象(host=邮件服务器地址, port=安全的SMTP,默认是465端口)
smtp_obj = smtplib.SMTP_SSL(host='smtp.qq.com', port=465)
# 1.登录授权 - smtp_obj.login(用户名, 授权码) 注意:这里不是密码而是服务器给的授权码
smtp_obj.login('xxxxx@qq.com', 'cktwkbtsaahydabj')
content = """
<p> 祝好</p>
<p>weilai</p>
<img src="http://bpic.588ku.com/back_list_pic/21/08/04/407487b62b3857e7281d7cde47df4b35.jpg!/fh/300/quality/90/unsharp/true/compress/true" width="600">
"""
# 获取搜狐页面
resp = requests.get('https://www.sohu.com/index.html')
html_page = MIMEText(resp.text+content, 'html', 'utf-8')
# 邮件的主体内容通过MIMEText 对象构造
# 创建邮件主体对象
m_part = MIMEMUltipart()
m_part['From'] = 'xxxxx@qq.com'
m_part['TO'] = 'xxxxx@qq.com;yyyyy@qq.com'
m_part['Subject'] = 'Python办公自动化'
# 文件内容
mime_text = MIMEText(content, 'plain', 'utf-8')
m_part.attach(mime_text)
m_part.attach(html_page)
with open(r'resources\第29课:用Python发送邮件和短信.pdf', 'rb') as file:
pdf_file = MIMEText(file.read(), 'base64', 'utf-8')
# 设置内容类型
pdf_file['content-type'] = 'application/pdf'
# 讲字符串处理成百分号编码 quote / unquote
filename = quote('第29课:用Python发送邮件和短信.pdf')
# 设置内容的处置方式(可下载的附件)
pdf_file['content-disposition'] = f"attachment; filename=utf-8''{filename}"
m_part.attach(pdf_file)
with open(r'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="alibaba-stock.xlsx"'
m_part.attach(excel_file)
# 2.发送邮件
# sendmail方法的三个重要参数
"""
from_addr - 发件人,跟上面的From保持一致
to_addrs - 收件人,可以是多个,跟上面的To保持一致
msg - 邮件内容
"""
# 调用MIMEText对象的as_string()方法,将邮件主体转换成字符串作为第三个参数
smtp_obj.sendmail(
from_addr='xxxxx@qq.com',
to_addrs=['xxxxx@qq.com', 'yyyyy@qq.com'],
msg=m_part.as_string()
)
# 结束会话
smtp_obj.quit()
# 1.什么是Base64
"""
base64是网络上最常见的用于传输8bit字节码的编码方式之一,base64就是一种基于64个可打印字符来表示二进制数据的方法
base64一般用于HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以再HTTP协议下
传输二进制数据需要将二进制数据转换成字符数据,然而直接转换是不行的,因为网络传输只能传输可打印字符
什么是可打印字符?在ASCII码中规定,0~31、127这33个字符属于控制字符,32~126这95个字符属于可打印字符,
也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输。那么该怎么才能传输其他字符呢?其中一种方式就是使用Base64。
例如:base64编码过程:
1、首先取ABC对应的ASCII码值。A(65)B(66)C(67);
2、再取二进制值A(01000001)B(01000010)C(01000011);
3、然后把这三个字节的二进制码接起来(010000010100001001000011);
4、 再以6位为单位分成4个数据块,并在最高位填充两个0后形成4个字节的编码后的值,(00010000)(00010100
)(00001001)(00000011),其中蓝色部分为真实数据;
5、再把这四个字节数据转化成10进制数得(16)(20)(9)(3);
6、最后根据BASE64给出的64个基本字符表,查出对应的ASCII码字符(Q)(U)(J)(D),这里的值实际就是数据在字符表中的索引。
"""
# 2.百分比编码
"""
百分比编码是一种拥有8位字符编码的编码机制,这些编码在URL的上下文中具有特定的含义,
它有时被称为URL编码。编码由英文字母替换组成:”%“后跟替换字符的ASCLL的十六进制表示
需要编码的特殊字符有:
':','/','?','#','[',']','@','!','$','&',"'",'(',')',
'*','+',',',';','=',以及,'%'`` 本身. 其他的字符虽然可以进行编码但是不需要
':' '/' '?' '#' '[' ']' '@' '!' '$' '&' "'" '(' ')' '*' '+' ',' ';' '=' '%' ' '
%3A %2F %3F %23 %5B %5D %40 %21 %24 %26 %27 %28 %29 %2A %2B %2C %3B %3D %25 %20 或 +
"""
用python发送短信 --> 调用三方短信网关
# HTTP --> 请求方法 --> GET / POST
import random
import requests
def send_message(tel, message):
"""
调用螺丝帽短信网关发送短信
:param tel: 接收短信的手机号
:param message: 短信内容
"""
resp = requests.post(
# 短信网关
url='http://sms-api.luosimao.com/v1/send.json',
auth=('api', 'key-ae81126514528b9d46c227177bd15ea4'),
data={
'mobile':tel,
'message':message
},
timeout=3,
verify=False
)
return resp.json()
def random_code(length=6):
return ''.join(random.choices('0123456789', k=length))
code = random_code()
print(code)
result = send_message('13548041193', f'魏晓琴的作业已发送至你的邮箱{code},请注意查收!【Python小课】')
print(result)
1.用python读取pdf(在python中可以使用PyPDF2的三方库来读取PDF文件, 可以用pip install PyPDF2命令来安装这个三方库)
# PyPDF2没有办法从PDF文档中提取图像、图表或其他媒体,但他可以提取文本,并将其返回为python字符串
# 读取pdf,抽取文字
import PyPDF2
from PyPDF2.pdf import PageObject
# 构造器语法创建一个读pdf文件的reader对象
reader = PyPDF2.PdfFileReader(r'resources\XGBoost.pdf')
# 获取指定页码的PageObject对象
page = reader.getPage(0) # type:PageObject
print(page.extractText())
"""
os.path.split(文件路径或文件名) - 按照路径将文件名和路径分割开
os.path.splitext(文件路径或文件名) - 分离文件名和扩展名,默认返回(文件名,文件后缀)
"""
# os.path.split()
path = os.path.split('/home/resp/use_name/wuxie1.pdf')
print(path) # ('/home/resp/use_name', 'wuxie.pdf') <class 'tuple'>
# os.path.splitext()
path = os.path.splitext('/home/resp/use_name/wuxie1.pdf')
print(path) # ('/home/resp/use_name/wuxie1', '.pdf')os.path.splitext
# pip freeze 将装了的三方库以及版本全部列出来
# pip uninstall -y -r requirements.txt 将安装的三方库在requirement.txt里的安装的三方库全部删除
import os.path
def get_filename(file_path):
"""
获取不带路径和后缀的文件名
:param file_path: 文件路劲
:return:
"""
_, fullname = os.path.split(file_path)
# print(fullname) # # watermark.pdf
filename, _ = os.path.splitext(fullname)
# print(filename) # watermark
return filename
# get_filename(r'resources/watermark.pdf')
def pdf_image(pdf_file, img_file, zoom_x=4, zoom_y=4, rotation_angle=0):
"""
将pdf文件转成png图片
:param pdf_file: pdf文件路劲
:param img_file: 保存图片路径
:param zoom_x: 缩放比例(横向)
:param zoom_y: 缩放比例(纵向)
:param rotation_angle: 旋转角度
"""
# 打开pdf文件
pdf = fitz.open(pdf_file)
# 逐页读取pdf
for pag_num in range(0, pdf.pageCount):
page_obj = pdf[page_num]
# 创建用于图像变换的矩阵
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
# 将pdf页面处理成图像
pm = page_obj.getPixmap(matrix=trans, alpha=False)
# 开始写图像
temp = get_filename(pdf_file)
pm.writePNG(f'{img_file}{temp}_{page_num + 1}.png')
pdf.close()
def main():
# 如果文件夹不存在就创建该文件夹
if os.path.exists('resources\\'):
os.makedirs('resources\\')
pdf_image(r'resources\XGBoost.pdf', 'resources\\')
if __name__ == '__main__':
main()
path = os.path.split('/home/resp/use_name/wuxie.pdf')
print(path, type(path))
3.旋转与叠加页面、加密pdf文件
# 生成依赖项清单的命令:pip freeze > requirements.txt
# 安装依赖项: pip install -r requirements.txt
import PyPDF2
from PyPDF2.pdf import PageObject
# 创建一个读pdf文件的Reader对象
reader = PyPDF2.PdfFileReader(r'resources\XGBoost.pdf')
# 创建一个写PDF文件的Writer对象
writer = PyPDF2.PdfFileWriter()
#对PDF文件所有页进行循环遍历
for pag_num in range(reader.getNumPages()):
# 获取指定页码的Page对象
page_obj = reader.getPage(pag_num) # type;PageObject
# 指定页顺时针旋转90度
page_obj.rotateClockwise(90)
writer.addPage(page_obj)
# 增加一个空白页并顺时针旋转90度
writer.addBlankPage()
blank_page = writer.addBlankPage() # type:PageObject
blank_page.rotateClockwise(90)
# 给pdf文件设置密码(口令), 通过encrypt方法加密pdf文件,方法的参数就是设置的密码
writer.encrypt('foobared')
# 通过Writer对象的write方法将PDF写入文件
with open(r'resources\XGBoost_modified.pdf', 'wb') as file:
writer.write(file)
1).读pdf文件添加水印
import PyPDF2
from PyPDF2.pdf import PageObject
# 读取水印页(这个页面也可以用python程序生成)
reader = PyPDF2.PdfFileReader(r'resources\watermark.pdf')
wm_page = reader.getPage(0)
# 创建一个读取pdf文件的reader对象
reader = PyPDF2.PdfFileReader(r'resources\XGBoost.pdf')
# 创建一个写pdf文件的writer对象
writer = PyPDF2.PdfFileWriter()
# 对pdf文件的所有页进行循环遍历
for pag_num in range(reader.getNumPages()):
# 获取指定页码的Page对象
page_obj = reader.getPage(pag_num) # type: PageObject
# 将水印页合并到现有的pdf文件的页面上
page_obj.mergePage(wm_page)
writer.addPage(page_obj)
with open(r'resources\XGBoost_watermark.pdf', 'wb') as file:
writer.write(file)
2)利用python程序生成水印
# 批量添加水印
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('resources/tang.jpg')
pdf_canvas.drawImage(image, 20, height - 395, 250, 375)
# 显示当前⻚
pdf_canvas.showPage()
# 注册字体⽂件
pdfmetrics.registerFont(TTFont('Font1', 'resources/fonts/aa.ttf'))
pdfmetrics.registerFont(TTFont('Font2', 'resources/fonts/dd.ttf'))
# 写字
pdf_canvas.setFont('Font2', 40)
pdf_canvas.setFillColorRGB(0.9, 0.5, 0.3, 1)
pdf_canvas.drawString(width // 2 - 120, height // 2, '你好,世界!')
pdf_canvas.setFont('Font1', 40)
pdf_canvas.setFillColorRGB(0, 1, 0, 0.5)
# 旋转角度
pdf_canvas.rotate(18)
pdf_canvas.drawString(250, 250, 'hello, world!')
# 保存
pdf_canvas.save()