💻课程代码
这套课程,原视频没提供代码,我自己在下班后,正在逐步完善全套代码。
现在邀请大家共建这套课程的代码:直接在代码仓库中,提交你的PR到对应的分P文件夹
🙋关于我
你好,我是Python程序员晚枫,我的微信:python-office
⭐今年我推出了陪你学习1年的Python学习服务,如果需要和晚枫1对1交流技术问题,可以扫码下图加好友👇
这套课程,原视频没提供代码,我自己在下班后,正在逐步完善全套代码。
现在邀请大家共建这套课程的代码:直接在代码仓库中,提交你的PR到对应的分P文件夹
你好,我是Python程序员晚枫,我的微信:python-office
⭐今年我推出了陪你学习1年的Python学习服务,如果需要和晚枫1对1交流技术问题,可以扫码下图加好友👇
下载地址:
测试代码
1 | # coding=UTF-8 |
大家好,这里是程序员晚枫。
最近Python星球里的一位朋友私信我,想学习一下Python自动化生成数据分析报告。
作为有问必答的知识星球,今天我们来一起学习一下~
reportlab是Python的一个标准库,可以画图、画表格、编辑文字,最后可以输出PDF格式。它的逻辑和编辑一个word文档或者PPT很像。有两种方法:
因为需要产生一份给用户看的报告,里面需要插入图片、表格等,所以采用的是第二种方法。
获取本文全套源代码 + 字体 + 报告全文,请关注下方公众号后,在后台发送:报告自动化,即可24小时自动获取~
reportlab输入Python的第三方库,使用前需要先安装,
为了方便大家使用,我已经将这个库集成到Python自动化办公的专用库:python-office中了,
因此一行命令就可以完成的安装命令如下👇
1 | pip install -i https://mirrors.aliyun.com/pypi/simple python-office -U |
1 | from reportlab.pdfbase import pdfmetrics # 注册字体 |
提前准备好字体文件, 如果同一个文件需要多种字体可以注册多个
1 | pdfmetrics.registerFont(TTFont('SimSun', 'SimSun.ttf')) |
1 | if __name__ == '__main__': |
生成报告的结果如下
发
获取本文全套源代码 + 字体 + 报告全文,请关注下方公众号后,在后台发送:报告自动化,即可24小时自动获取~
大家好,这里是程序员晚枫。Python学习服务:点我查看
在Python中,表示时间的格式一共有3种:时间戳、结构化时间、格式化时间,2个模块:time、datetime。
今天我们来一起看一下。
时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。
1 | import time |
这种方式得到的时间,一般用来数据库存储,非常节省存储空间。
所谓结构化时间,你可以理解成把时间进行了分类,分为了:年月日时分秒,你想用哪个类别,就可以直接取出哪个类别。
如果我们想取出一个时间片段,用这个方法就很简单了,例如:取出当前时间的分钟数。
1 | import time |
这个方法,用来给用户展示时间。
1 | import time |
在前面生成时间的代码中,我们使用了2个模块:time和datetime,好像它们之间的功能也是重复的。
既然有了time模块,为什么还要有datetime?那是为了简化time的使用。
datatime模块重新封装了time模块,提供更多接口,提供的类有:date,time,datetime,timedelta,tzinfo。
在之前的文章中我们讲过:万字总结!Python 实现定时任务的八种方案
在定时任务中,我想设置一个一周后提醒我的功能。
如果用time模块进行实现
1 | import time |
需要自己计算出7天后的时间戳,而如果使用datetime模块,这件事就很简单了:直接days + 7
,如下图代码所示。
1 | import datetime |
时间戳和结构化数据、字符串数据之间,可以进行转换。这一点的注意事项见上图,这里不再赘述,如有疑问,可以添加我的微信,进行更加详细的沟通👉python-office
安装vmware
安装mac:
你好,我是Python程序员晚枫,我的微信:python-office
⭐今年我推出了陪你学习1年的Python学习服务:👇
如果需要和晚枫1对1交流技术问题,可以扫码下图加好友👇
大数据学习的路线图,见文章👉路线图
以下是文章中提到的学习资料,也是我自己正在学习的内容,欢迎添加我的微信,和我交流~
以下是免费读者交流群,可以进群和大家讨论学习
大家好,这里是小编晚枫。
鸽了半个月的6月总结,终于有时间写了。前文回顾:5月总结
6月收获不少,
拿到了心心念念的阿里云专家博主、华为云享专家、百度平台教育创作者认证。
作品被更多人看到,受到了更多人的认可,价格自然就水涨船高。
合理缴税的情况下,遇到合理的恰饭我也不拒绝。
但是每次都约到夜里0点以后的沟通,也成为了家常便饭。我好像睡个早觉啊~
到今年6月,正好是毕业后干了3年程序员,也写了3年自媒体了。
期间也获得过一些所谓的荣誉和实打实的收益,更重要的是见识到了很多牛人,让我更加深刻的认识到自己的差距。
自己从法学院毕业后,凭着对编程的爱好转行程序员,从完全0基础,到现在转行程序员的第3年,很庆幸,这条路我依然乐在其中。
但与此同时,我也通过这几年对技术的学习和应用,认识到自己才刚刚踏入编程世界的大门,而基础理论和专业知识才可以决定接下来的路,能走多远。
所以6月以来,做了2件重要的调整:
根据费曼学习法,能把一个知识给别人讲明白,我自己也会理解得更好。这也是我3年前做自媒体的初衷。
但是自媒体接广告恰饭赚钱,更多像是一个只能写词的作者,把自己幸苦创作的作品,拿给别人演唱。自己距离用户,太远了。
所以我也希望接下来,通过在这个星球里的输出和答疑,给我自己的读者提供学习上更直接有效,更有价值的帮助。
也感谢大家的支持,星球陆续有朋友加入了。
关于星球,特别欢迎喜欢我、认可我的读者加入,
但是在这里我也特别想给每一位私信我问问题的朋友,说1个无奈的点。
2019年我刚开始写文章、录视频,几十位、几百位朋友关注我的时候,我都是尽力回复每个人的问题。但是现在我做不到了,我给你快速地算个时间账:
单说微信这一个平台,我平均每天收到20+个提问,假设每人答疑最少6分钟,我每天需要120分钟,也就是2个小时用来答疑。而我全平台都有账号,目前全网粉丝20w+,再加上我的本职工作是本来就很紧张的程序员,我是真的回复不过来。
观众老爷们,这种情况下,如果是你,你怎么办?
我的做法就是,从今年粉丝暴涨后,我就不做免费答疑了,我只能先把这个知识星球里的问题,解决好。
加入星球之前,你可以和我私信沟通一下你的学习目的,我评估一下能不能帮助你,或者给你一些实用的建议。如果我听完你的问题,觉得自己帮助不了你,我会直接建议你另请高明。我的微信,点击直达👉python-office
你只要加入这个星球,我都会认真履行上面说的服务,认真去答疑,和大家一起学习进步。
如果我写了这3年:几十万字的文章、几百集的视频,都不能让你信任我,依然觉得我的时间和经验一文不值的话,那我没法选择,我只能给认可我的朋友回复问题了。或者你可以继续去看我的文章。全网同名:程序员晚枫,你也可以直接百度一下:程序员晚枫,就可以看到大量我的文章和视频。
以后再有朋友加我问问题,我就直接给你我的星球二维码和这篇文章。一方面,我不会因为你的问题紧急而坐地起价,我的时间明码标价;另一方面,我也不会做什么优惠活动。365元:制定学习计划 + 整理学习资料 + 有问必答 + 服务1年,这目前是我的底线。
除了工作、答疑的时间,我自己就继续埋头学更多的技术、写更有价值的文章,去继续提高自己;去拿到更多平台的认可;无聊了哪怕再去流量变现,接一些2w+、未来可能会3w+的恰饭呢。
当然了,如果其实你就只有1个问题或者你只是想有个Python学习环境,先了解了解,我建议你加入我的👉读者群,和大家进行沟通交流。
1元进群,防止无良广告。你也可以直接加我微信🏠python-office,说一下你能提供的价值,我免费邀请你,非常欢迎能提供价值的朋友。
安卓是1元=10个微信豆,苹果是1元=7个微信豆,价格不一样,平台的问题。
物以类聚,人以群分,我自己是热衷研究技术、分享技术的博主,所以我的读者群里大部分也是这类人,很多小问题,读者群就能帮你解决,不一定非得找我1对1答疑。另外,偶尔我也会在读者群发一些福利活动。
点击直达👉读者群,满500人开新群。
str = ‘pip install python-office {content}’
print(‘-‘.join(str)) # 用来指定拼接符号,拼接出一个字符串,效率比+高
print(str.center(100, ‘*’)) # 字符串居中,左右填充指定内容
print(str.count(‘p’)) # 指定内容,在原str中出现了多少次
print(str.find(‘pip’)) # 包含pip,则返回开始的索引值,否则返回-1。
print(str.index(‘pip’)) # 包含pip,则返回开始的索引值,否则返回Exception。
print(str.rfind(‘ ‘)) # 返回参数字符串在字符串中最后一次出现的位置。没有查询到则返回-1.
print(str.rindex(‘ ‘)) # 返回参数字符串在字符串中最后一次出现的位置。没有查询到则返回Exception.
print(str.replace(‘ ‘, ‘-‘)) # 替换操作,str.replace()函数并不对原有的字符串进行改变。
print(str.ljust(50, ‘‘)) # 返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。
print(str.rjust(50, ‘‘)) # 它将原字符串右对齐,并使用空格填充至指定长度,并返回新的字符串。如果指定的长度小于原字符串长度,则直接返回原字符串。
print(str.zfill(50)) # 返回指定长度的字符串,原字符串右对齐,前面填充0。
print(str.partition(‘ ‘)) # 如果字符串包含指定的分隔符,则返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串。
print(str.rpartition(‘ ‘)) # 类似于 partition() 方法,只是该方法是从目标字符串的末尾也就是右边开始搜索分割符。
print(str.rsplit(‘ ‘)) # 如果给出了 maxsplit,则最多进行 maxsplit 次拆分,从 最右边 开始。
print(str.split(‘ ‘)) # 分割字符串
print(str.splitlines()) # 按照行界符(‘\r’, ‘\r\n’, \n’等)分隔,返回一个包含各行作为元素的列表,默认不包含行界符。
print(str.lstrip(‘p’)) # 删除从开头开始指定的字符串,然后返回结果字符串。注意:只能从开头开始
print(str.rstrip(‘p’)) # 删除 string 字符串末尾的指定字符,默认为空白符,包括空格、换行符、回车符、制表符。
print(str.strip()) # 删除前后的指定字符,默认是空格
print(str.capitalize()) # 第一个字母大写,对中文无效
print(str.lower()) # 字母转为小写,只对英语有效
print(str.casefold()) # 字母转为小写,所有语言都有效,例如:德语
print(str.upper()) # 字母全部转为大写,英语有效
print(str.swapcase()) # 将字符串中的英文字母大小写互换,并返回修改后的字符串。
print(str.title()) # 将字符串中的每个单词首字母大写,其余字母小写,并返回新的字符串。
print(str.startswith(‘pip’)) # 判断是否以pip为开头
print(str.endswith(‘office’)) # 判断str是否以office结尾
print(str.isalnum()) # 如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False
print(str.isalpha()) # 如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False
print(str.isascii()) # 如果字符串为空或字符串中的所有字符都是 ASCII,则返回 True,否则返回 False。
print(str.isdecimal()) # 如果字符串中的所有字符都是十进制字符,则返回True
print(str.isdigit()) # isdigit函数检测字符串中是否只包含数字字符。若全部是由数字字符组成的字符串,则返回True,否则返回False。isdigit函数没有参数。
print(str.isidentifier()) # 如果字符串是Python中的有效标识符,返回True。如果不是,则返回False。
print(str.islower()) # islower() 方法检测字符串是否由小写字母组成.
print(str.isupper()) # 检测字符串中所有的字母是否都为大写。
print(str.isnumeric()) # 检查字符串中是否只包含数值字符。此方法只适用于Unicode的对象。
print(str.isprintable()) # 如果字符串中的所有字符都可打印或字符串为空,则返回 True,否则返回 False。
print(str.isspace()) # 检测字符串是否只由空白字符组成。
print(str.istitle()) # 检测字符串中所有的单词拼写首字母是否为大写,且其他字母为小写。
print(str.maketrans())#此静态方法返回一个 可供 str.translate() 使用的转换对照表。
print(str.translate())
print(str.encode(encoding=’utf8’, errors=’strict’)) # 返回字符串编码后的数据,默认的编码是当前的字符串编码。errors为给定的不同错误处理方法。
print(str.expandtabs()) # 用空格替换\t符号
print(str.format(content=’yyds’))
format_map_dict = {‘content’: ‘yyds’}
print(str.format_map(format_map_dict)) # str.format_map(mapping) 方法仅适用于字符串格式中可变数据参数来源于字典等映射关系数据时。mapping 会被直接使用而不是复制到一个 dict。
大家好,这里是程序员晚枫。
上次我们分享了:4千字总结!Python生成随机数的22种方法,random函数太强了~
今天用一道华为笔试题,带大家深入掌握一项Python技巧:正则表达式。
本文主要分为4个部分:题目解析、常用方法、专业方法、注意事项
先来看一下题目。
看完题目,有以下2个解题思路:
1 | def cut_8ch(str): |
1 | import re |
很明显,思路2实现起来,逻辑更清晰,代码更简洁。原因在哪里呢?
因为使用了str的自带方法和Python自带的标准库:re模块。
之前给大家整理了:
今天我们重点讲一下re模块的使用。
关于str的所有自带方法,如果大家想看的话,可以加入交流群告诉我:交流群。我可以另写一个篇新的文章来介绍。
按照惯例,我们对Python知识的解析,直接拿源码来研究。先看一下python源码里,re模块提供的12个方法👇
找出所有符合条件的内容。
举例:
我们现在有一句话,里面有一些数字,我们想把这些数字都提取出来:程序员晚枫,今年18
岁,家里存款100
多,车有0
辆,多谢各位的10086
+个点赞
1 | import re |
对字符串进行分割。
举例:
假如我们现在有一组字符串:程序员晚枫5
程序员晚枫4
程序员晚枫7
程序员晚枫,其中混进了一些无规律的数字:5、4、7,这次我们想根据这些数字,把这个字符串分割。
1 | import re |
可以替换字符串中的内容。
举例:
假如我们现在有一组字符串:程序员晚枫5
程序员晚枫4
程序员晚枫7
程序员晚枫,其中混进了一些无规律的数字:5、4、7,我们想根据这些数字,替换成逗号:,
。
1 | import re |
re.match()必须从字符串开头匹配!
举例:
match方法,可以帮我们匹配出这段文字中的英文字母,"CoderWanFeng,加好友,联系程序员晚枫"
1 | import re |
fullmatch见名知义:只有在给定的字符串全部匹配时,才返回正确。
举例:
匹配用户输入的电话号码是否都是数字+符合11位。
1 | import re |
查找字符串中是否有符合条件的内容。
1 | import re |
subn和sub的方法类似,区别在于:subn()方法返回一个元组,其中包含所有替换的总数以及新字符串。
看到subn方法我困惑了一下,它和sub的区别时什么?
看过源码👇才知道,区别就是那个n。
1 | import re |
这个方法返回的是一个迭代器。
1 | import re |
re.compile()是用来优化正则的,它将正则表达式转化为对象,re.search(pattern, string)的调用方式就转换为 pattern.search(string)的调用方式,多次调用一个正则表达式就重复利用这个正则对象,可以实现更有效率的匹配。
如下列代码所示,re.compile生成pattern后,依然需要调用re的方法。
1 | import re |
如源码所说,这个方法主要是用来清楚缓存。
Python标准库中唯一调用re.purge()的位置是在测试中(特别是test_re模块的re单元测试和回归测试套件中的参考泄漏测试)。
这个方法我没找到怎么使用,欢迎大家在评论区补充。
可以将字符串中所有可能被解释为正则运算符的字符进行转译。
1 | re.escape('www.python-office.com') |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true