python学习的第二十七天:第四周总结——办公自动化
文件
-
通过文件系统将数据储存到文件中,我们实现了数据的持久化 -
计算机的文件系统是一种存储和组织计算机数据的方法,它使得对数据的访问和查找变得容易 -
文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘、光盘、闪存等物理设备的数据块概念
对文件的操作
文件的打开和关闭
- 通过open函数打开,同时可以通过参数指定文件名、操作模式和字符编码等信息
操作模式 | 具体含义 |
---|
'r' | 读取 (默认) | 'w' | 写入(会先截断/覆盖之前的内容) | 'x' | 写入,如果文件已经存在会产生异常(创建) | 'a' | 追加,将内容写入到已有文件的末尾 | 'b' | 二进制模式(图片) | 't' | 文本模式(默认) | '+' | 更新(既可以读又可以写) |
使用open函数时可以通过encoding参数指定读写文件使用的字符编码,常用编码为utf-8
文件简单操作
-
通过read函数读取文件 或者通过循环和readline逐次读行进行读取 -
文件的指针操作seek函数 -
对csv文件的操作:
- 自带包工具csv
- 通过writerow方法进行写操作
-
通过write进行TXT文件的写操作 -
下载图片:通过
- requests.get()获取网络数据
- 通过写操作记录获取的二进制数据(即图片数据)
Excel
三方库:
- xlrd / xlwt / xlutils —> 兼容低版本的Excel文件(xls)
- openpyxl —> Office 2007+ —> xlsx
Excel的读写操作
使用xlrd和xlwd读写Excel
读操作
- 通过open_workbook()打开Excel文件
- 通过sheet_names()获取所有工作表的名字
- 通过sheet_by_name()(根据工作表命名)和sheet_by_index(根据工作表编号)获取指定工作表
- 通过nrows和ncols分别获取指定行数和列数
- 通过row()(行的序号)和row_slice()(行的范围)获取指定列
- 通过col()(列的序号)和col_slice()(列的范围)获取指定列
- 通过cell选取指定单元格,通过value获得指定单元格的数据
写操作
- 通过workbook创建工作簿
- 通过add_sheet(创建工作表)
- 通过XFStyle,pattern,pattern.SOLID_PATTERN准备美化单元格
- 通过Style.colour_map[]指定单元格颜色
- 通过Font()指定单元格字体大小
- 通过width,height指定行高列宽
- 通过Alignment指定单元格文本对齐方式
- 通过write记录数据
- 通过save保存文件
使用openpyxl读写Excel文件
读文件
- 通过load_workbook加载文件
- 通过sheetnames获取工作表名字
- 通过worksheet获取工作表
- 通过dimensions获取单元格范围
- 通过max_row和max.colum获取行数和列数
- max_row和max_column分别获取行数和列数
- 通过cell(指定单元格的序号)或[](指定单元格)获取指定单元格,通过value获取单元格数据
写操作
- 通过workbook创建工作簿
- 通过create_sheet()创建工作表,通过active激活
- 通过title设置单元格名称
- 通过cell为指定单元格赋值
- 通过save保存文件
小工具datatime
- 通过输入年月日时分秒返回格式化的日期,不输入默认为0
- 通过now()获取计算机当前时间
- 直接作差会得到时间差对象,此时可以通过days和seconds获取相差的天数和秒数
- 通过strftime格式化时间日期
word
安装三方库
python-docx —> pip install python-docx pillow pillow —> PIL —> Python Image Library,图片处理工具
对Word的读写操作
- 通过Document()创建Word
- 通过add_heading()添加标题,通过参数level控制标题级数
- 通过add.paragragh()添加段落,通过参数style控制样式
- 通过add.run()创建指定格式的文本
- 通过hold = True加粗
- 通过font.size = Pt()设置字体大小
- 通过italic = True控制斜体
- 通过underline = True控制下划线
- 通过add_picture添加图片,通过width控制文件大小
- 通过add_section()添加分字符
- 通过add_table添加表格
- 通过参数rows和cols控制创建表格的行数和列数
- 通过[]控制输入数据的位置,text指定输入字符串
- 通过add_row()和add_col()添加行和列
- 通过add_page_break()添加分页符
- 通过save保存文件
邮件
smtplib Header MIMEMultipart MIMEText quote
书写和发送邮件
- 获取授权码
- 登入邮箱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_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()
正则表达式
- 正则表达式 —> 模式 —> 匹配字符串的模式 —> 复杂的匹配规则
- 字符集 —> [] —> [a-zA-Z0-9_]{6,20} —> \w{6,20} —> ^\w{6,20}$
- Python使用正则表达式的两种方式:
- 不创建正则表达式对象,直接调用函数进行匹配操作
- 创建正则表达式对象(Pattern),通过给对象发消息实现匹配操作
正则表达式的应用方法
match - 匹配 - 从头开始进行匹配 —> Match对象 —> group() search - 搜索 - 从任意位置匹配 —> Match对象 —> group() findall - 从字符串中找出所有和正则表达式匹配的内容 —> list[str]
例子:
检查用户名是否合法
import re
username = input('请输入用户名: ')
username_pattern = re.compile(r'^\w{6,20}$')
print(type(username_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
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 = 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)
|