第五周总结

第五周总结

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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值