python学习的第二十七天:第四周总结——办公自动化

python学习的第二十七天:第四周总结——办公自动化

文件

  • 通过文件系统将数据储存到文件中,我们实现了数据的持久化

  • 计算机的文件系统是一种存储和组织计算机数据的方法,它使得对数据的访问和查找变得容易

  • 文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘、光盘、闪存等物理设备的数据块概念

对文件的操作

文件的打开和关闭
  • 通过open函数打开,同时可以通过参数指定文件名、操作模式和字符编码等信息
操作模式具体含义
'r'读取 (默认)
'w'写入(会先截断/覆盖之前的内容)
'x'写入,如果文件已经存在会产生异常(创建)
'a'追加,将内容写入到已有文件的末尾
'b'二进制模式(图片)
't'文本模式(默认)
'+'更新(既可以读又可以写)

使用open函数时可以通过encoding参数指定读写文件使用的字符编码,常用编码为utf-8

  • 通过close关闭文件,释放文件占用的内存
文件简单操作
  • 通过read函数读取文件

    或者通过循环和readline逐次读行进行读取

  • 文件的指针操作seek函数

  • 对csv文件的操作:

    • 自带包工具csv
    • 通过writerow方法进行写操作
  • 通过write进行TXT文件的写操作

  • 下载图片:通过

    • requests.get()获取网络数据
    • 通过写操作记录获取的二进制数据(即图片数据)

Excel

三方库:

  • xlrd / xlwt / xlutils —> 兼容低版本的Excel文件(xls)
  • openpyxl —> Office 2007+ —> xlsx

Excel的读写操作

使用xlrd和xlwd读写Excel
读操作
  1. 通过open_workbook()打开Excel文件
  2. 通过sheet_names()获取所有工作表的名字
  3. 通过sheet_by_name()(根据工作表命名)和sheet_by_index(根据工作表编号)获取指定工作表
  4. 通过nrows和ncols分别获取指定行数和列数
  5. 通过row()(行的序号)和row_slice()(行的范围)获取指定列
  6. 通过col()(列的序号)和col_slice()(列的范围)获取指定列
  7. 通过cell选取指定单元格,通过value获得指定单元格的数据
写操作
  1. 通过workbook创建工作簿
  2. 通过add_sheet(创建工作表)
  3. 通过XFStyle,pattern,pattern.SOLID_PATTERN准备美化单元格
  4. 通过Style.colour_map[]指定单元格颜色
  5. 通过Font()指定单元格字体大小
  6. 通过width,height指定行高列宽
  7. 通过Alignment指定单元格文本对齐方式
  8. 通过write记录数据
  9. 通过save保存文件
使用openpyxl读写Excel文件
读文件
  1. 通过load_workbook加载文件
  2. 通过sheetnames获取工作表名字
  3. 通过worksheet获取工作表
  4. 通过dimensions获取单元格范围
  5. 通过max_row和max.colum获取行数和列数
  6. max_row和max_column分别获取行数和列数
  7. 通过cell(指定单元格的序号)或[](指定单元格)获取指定单元格,通过value获取单元格数据
写操作
  1. 通过workbook创建工作簿
  2. 通过create_sheet()创建工作表,通过active激活
  3. 通过title设置单元格名称
  4. 通过cell为指定单元格赋值
  5. 通过save保存文件

小工具datatime

  1. 通过输入年月日时分秒返回格式化的日期,不输入默认为0
  2. 通过now()获取计算机当前时间
  3. 直接作差会得到时间差对象,此时可以通过days和seconds获取相差的天数和秒数
  4. 通过strftime格式化时间日期

word

安装三方库

python-docx —> pip install python-docx pillow
pillow —> PIL —> Python Image Library,图片处理工具

对Word的读写操作

  1. 通过Document()创建Word
  2. 通过add_heading()添加标题,通过参数level控制标题级数
  3. 通过add.paragragh()添加段落,通过参数style控制样式
  4. 通过add.run()创建指定格式的文本
    • 通过hold = True加粗
    • 通过font.size = Pt()设置字体大小
    • 通过italic = True控制斜体
    • 通过underline = True控制下划线
  5. 通过add_picture添加图片,通过width控制文件大小
  6. 通过add_section()添加分字符
  7. 通过add_table添加表格
    • 通过参数rows和cols控制创建表格的行数和列数
    • 通过[]控制输入数据的位置,text指定输入字符串
    • 通过add_row()和add_col()添加行和列
  8. 通过add_page_break()添加分页符
  9. 通过save保存文件

邮件

smtplib
Header
MIMEMultipart
MIMEText
quote

书写和发送邮件

  1. 获取授权码
    • 登入邮箱POP3/SMTP/IMAP
    • POP3/SMTP服务 已关闭 | 开启 (点击开启)
    • 扫码申请成功后获得授权码
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from urllib.parse import quote


def create_attachment(path, filename):
    with open(f'{path}/{filename}', 'rb') as file:
        attachment = MIMEText(file.read(), 'base64', 'utf-8')
        # 指定内容类型
        attachment['content-type'] = 'application/octet-stream'
        # 将文件名处理成百分号编码
        filename = quote(filename)
        # 指定如何处置内容
        attachment['content-disposition'] = f'attachment; filename="{filename}"'
    return attachment


# 创建邮件主体对象
email = MIMEMultipart()
# 设置发件人、收件人和主体
email['From'] = Header('你个人的邮箱')
email['To'] = Header('你想要发送给的人1号;你想要发送给的人2号')
email['Subject'] = Header('离职证明文件请查收', 'utf-8')
# 添加邮件正文内容
content = """据德国媒体报道,当地时间9日,德国火车司机工会成员进行了投票,
定于当地时间10日起进行全国性罢工,货运交通方面的罢工已于当地时间10日19时开始。
此后,从11日凌晨2时到13日凌晨2时,德国全国范围内的客运和铁路基础设施将进行48小时的罢工。"""
email.attach(MIMEText(content, 'plain', 'utf-8'))
# 添加一个附件
email.attach(create_attachment('resources', '离职证明.docx'))
# 再添加一个附件
email.attach(create_attachment('resources', '阿里巴巴2020年股票数据.xlsx'))

# 创建SMTP_SSL对象(连接邮件服务器)
# SMTP服务器,由于我使用网易的126邮箱
smtp_obj = smtplib.SMTP_SSL('smtp.126.com', 465)
# 通过用户名和授权码进行登录
smtp_obj.login('个人邮箱', '授权码申请步骤如下')
# 发送邮件(发件人、收件人、邮件内容(字符串))
smtp_obj.sendmail(
    '个人邮箱',
    ['你想要发送给的人1号', '你想要发送给的人2号'],
    email.as_string()
)

发送短信

# 通过短信平台发送短信

import random
import requests


def send_message_by_luosimao(tel, message):
    """发送短信(调用螺丝帽短信网关)"""
    resp = requests.post(
        url='http://sms-api.luosimao.com/v1/send.json',
        auth=('api', 'key-20553a237c74f641d7cc3cfd412771a1'),
        data={
            'mobile': tel,
            'message': message
        },
        timeout=10,
        verify=False
    )
    return resp.json()


def gen_mobile_code(length=6):
    """生成指定长度的手机验证码"""
    return ''.join(random.choices('0123456789', k=length))


def main():
    code = gen_mobile_code()
    message = f'您的短信验证码是{code},打死也不能告诉别人哟!【python课程】'
    print(send_message_by_luosimao('手机号', message))


if __name__ == '__main__':
    main()

正则表达式

  1. 正则表达式 —> 模式 —> 匹配字符串的模式 —> 复杂的匹配规则
  2. 字符集 —> [] —> [a-zA-Z0-9_]{6,20} —> \w{6,20} —> ^\w{6,20}$
  3. Python使用正则表达式的两种方式:
    • 不创建正则表达式对象,直接调用函数进行匹配操作
      • match
      • fullmatch
    • 创建正则表达式对象(Pattern),通过给对象发消息实现匹配操作
      • compile

正则表达式的应用方法

match - 匹配 - 从头开始进行匹配 —> Match对象 —> group()
search - 搜索 - 从任意位置匹配 —> Match对象 —> group()
findall - 从字符串中找出所有和正则表达式匹配的内容 —> list[str]

例子:

检查用户名是否合法
# 网站注册,用户名要求必须是字母、数字、下划线,长度在6到20个字符之间
# 检查用户名是否合法
import re

username = input('请输入用户名: ')
# 通过compile编译正则表达式创建Pattern对象
username_pattern = re.compile(r'^\w{6,20}$')
print(type(username_pattern))
# 通过给Pattern对象发消息实现匹配检查
matcher = username_pattern.match(username)
print(type(matcher))
if matcher is None:
    print('无效的用户名!!!')
else:
    print(matcher.group())
从字符串中提取跟正则表达式匹配的部分
import re

content = """报警电话:110,我们班是Python-2105班,
我的QQ号是1234567,我的手机号是13811223344,谢谢!"""


pattern = re.compile(r'\d+')
matcher = pattern.search(content)
while matcher:
    print(matcher.group())
    print(matcher.start(), matcher.end())
    matcher = pattern.search(content, matcher.end())

results = pattern.findall(content)
for result in results:
    print(result)

results = re.findall(r'\d+', content)
for result in results:
    print(result)
从网页上获取新闻的标题和链接
import re

import requests

resp = requests.get('https://www.sohu.com/')
content = resp.text

pattern1 = re.compile(r'href="http.+?"')
matcher = pattern1.search(content)
while matcher:
    print(matcher.group()[6:-1])
    matcher = pattern1.search(content, matcher.end())

pattern2 = re.compile(r'title=".+?"')
titles_list = pattern2.findall(content)
for title in titles_list:
    print(title[7:-1])
正则表达式捕获组
import re

import requests

# 匹配整个a标签,但是只捕获()中的内容 ---> 正则表达式的捕获组
pattern = re.compile(r'<a\s.*?href="(.+?)".*?title="(.+?)".*?>')
resp = requests.get('https://www.sohu.com/')
results = pattern.findall(resp.text)
for href, title in results:
    print(title)
    print(href)
不良内容过滤
import re

content = '小明是一个沙雕煞笔,FUck you!'
pattern = re.compile(r'[傻沙鲨煞][吊逼笔雕鄙]|马小明|fuck|shit', flags=re.IGNORECASE)
# modified_content = re.sub(r'[傻沙煞][逼笔雕鄙]|马化腾|fuck|shit', '*', content, flags=re.I)
modified_content = pattern.sub('*', content)
print(modified_content)
拆分字符串
import re

poem = '窗前明月光,疑是地上霜。举头望明月,低头思故乡。'
pattern = re.compile(r'[,。]')
sentences_list = pattern.split(poem)
print(sentences_list)
sentences_list = [sentence for sentence in sentences_list if sentence]
print(sentences_list)
for sentence in sentences_list:
    print(sentence)

ub(’*’, content)
print(modified_content)


#### 拆分字符串

```python
import re

poem = '窗前明月光,疑是地上霜。举头望明月,低头思故乡。'
pattern = re.compile(r'[,。]')
sentences_list = pattern.split(poem)
print(sentences_list)
sentences_list = [sentence for sentence in sentences_list if sentence]
print(sentences_list)
for sentence in sentences_list:
    print(sentence)
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

踏墟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值