Original: https://www.cnblogs.com/jnjnj/p/16226419.html
Author: python茜
Title: python是什么?工作前景如何?怎么算有基础?爬数据违法嘛?。。
相关阅读1
Title: 5个方便好用的Python自动化脚本
相比大家都听过自动化生产线、自动化办公等词汇,在没有人工干预的情况下,机器可以自己完成各项任务,这大大提升了工作效率。
编程世界里有各种各样的自动化脚本,来完成不同的任务。
尤其Python非常适合编写自动化脚本,因为它语法简洁易懂,而且有丰富的第三方工具库。
这次我们使用Python来实现几个自动化场景,或许可以用到你的工作中。
很多人学习蟒蛇,不知道从何学起。
很多人学习寻找python,掌握了基本语法之后,不知道在哪里的案例上手。
很多已经可能知道案例的人,却不怎么去学习更多高深的知识。
这三类人,我给大家提供一个好的学习平台,免费获取视频教程,电子书,以及课程的源代码!
QQ群:101677771
欢迎加入,一起讨论学习
1、自动化阅读网页新闻
这个脚本能够实现从网页中抓取文本,然后自动化语音朗读,当你想听新闻的时候,这是个不错的选择。
代码分为两大部分,第一通过爬虫抓取网页文本呢,第二通过阅读工具来朗读文本。
需要的第三方库:
Beautiful Soup - 经典的HTML/XML文本解析器,用来提取爬下来的网页信息
requests - 好用到逆天的HTTP工具,用来向网页发送请求获取数据
Pyttsx3 - 将文本转换为语音,并控制速率、频率和语音
<span class="hljs-keyword">import pyttsx3
<span class="hljs-keyword">import requests
<span class="hljs-keyword">from bs4 <span class="hljs-keyword">import BeautifulSoup
engine = pyttsx3.init(<span class="hljs-string">'sapi5')
voices = engine.getProperty(<span class="hljs-string">'voices')
newVoiceRate = <span class="hljs-number">130 </span></span></span></span></span></span></span>
2、自动生成素描草图
这个脚本可以把彩色图片转化为铅笔素描草图,对人像、景色都有很好的效果。
而且只需几行代码就可以一键生成,适合批量操作,非常的快捷。
需要的第三方库:
Opencv - 计算机视觉工具,可以实现多元化的图像视频处理,有Python接口
<span class="hljs-string">""" Photo Sketching Using Python """
<span class="hljs-keyword">import cv2
img = cv2.imread(<span class="hljs-string">"elon.jpg")
</span></span></span>
3、自动发送多封邮件
这个脚本可以帮助我们批量定时发送邮件,邮件内容、附件也可以自定义调整,非常的实用。
相比较邮件客户端,Python脚本的优点在于可以智能、批量、高定制化地部署邮件服务。
需要的第三方库:
Email - 用于管理电子邮件消息
Smtlib - 向SMTP服务器发送电子邮件,它定义了一个 SMTP 客户端会话对象,该对象可将邮件发送到互联网上任何带有 SMTP 或 ESMTP 监听程序的计算机
Pandas - 用于数据分析清洗地工具
<span class="hljs-keyword">import smtplib
<span class="hljs-keyword">from email.message <span class="hljs-keyword">import EmailMessage
<span class="hljs-keyword">import pandas <span class="hljs-keyword">as pd
<span class="hljs-function"><span class="hljs-keyword">def <span class="hljs-title">send_email<span class="hljs-params">(remail, rsubject, rcontent):
email = EmailMessage() </span></span></span></span></span></span></span></span></span>
4、自动化数据探索
数据探索是数据科学项目的第一步,你需要了解数据的基本信息才能进一步分析更深的价值。
一般我们会用pandas、matplotlib等工具来探索数据,但需要自己编写大量代码,如果想提高效率,Dtale是个不错的选择。
Dtale特点是用一行代码生成自动化分析报告,它结合了Flask后端和React前端,为我们提供了一种查看和分析Pandas数据结构的简便方法。
我们可以在Jupyter上实用Dtale。
需要的第三方库:
Dtale - 自动生成分析报告
5、自动桌面提示
这个脚本会自动触发windows桌面通知,提示重要事项,比如说:您已工作两小时,该休息了
我们可以设定固定时间提示,比如隔10分钟、1小时等
用到的第三方库:
win10toast - 用于发送桌面通知的工具
from win10toast import ToastNotifier
import <span class="hljs-built_in">time
toaster = ToastNotifier()
header = <span class="hljs-built_in">input(<span class="hljs-string">"What You Want Me To Remember\n")
text = <span class="hljs-built_in">input(<span class="hljs-string">"Releated Message\n")
time_min=float(<span class="hljs-built_in">input(<span class="hljs-string">"In how many minutes?\n"))
time_min = time_min * <span class="hljs-number">60
<span class="hljs-built_in">print(<span class="hljs-string">"Setting up reminder..")
<span class="hljs-built_in">time.sleep(<span class="hljs-number">2)
<span class="hljs-built_in">print(<span class="hljs-string">"all set!")
<span class="hljs-built_in">time.sleep(time_min)
toaster.show_toast(f<span class="hljs-string">"{header}", f<span class="hljs-string">"{text}", duration=<span class="hljs-number">10, threaded=True)
<span class="hljs-keyword">while toaster.notification_active(): <span class="hljs-built_in">time.sleep(<span class="hljs-number">0.005)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
小结
Python能实现的自动化功能非常丰富,如果你可以"偷懒"的需求场景不妨试试。
Original: https://www.cnblogs.com/sn5200/p/15879878.html
Author: Python可乐的呀
Title: 5个方便好用的Python自动化脚本
相关阅读2
Title: Python自学教程5-字符串有哪些常用操作
任何编程语言,不管是Python、Java 还是 Golang, 字符串都是最重要的一种数据类型。 但是字符串的操作又很多,初学者经常毫无头绪,不知道从哪儿学起,也不知道哪些操作用得多,今天九柄就和你来扒一扒Python当中,怎么使用字符串比较合适。
字符串是什么
可以说,你在世界上看到的任意文字都将以字符串的形式展示,任何数据和内容也都可以用字符串表示,为了方便,我们就把字符串称为文字吧。
在 Python 中表示字符串有很多形式。在数据左右两边加一对引号,可以是单引号,双引号和三引号。引号是英文半角,全角会报错。
# 双引号 a = "jiubing" # 单引号 a = 'jiubing' # 三引号 a = '''jiubing''' a = """jiubing""" # 全角 Error a = 'jiubing'
三引号既可以表示字符串,又可以表示注释。它们的区别在于是否使用变量存储,没有存储的字符串,无法复用,就是注释。
字符串如何获取某个字符
从字面上看,字符串是用字符串起来的,和羊肉串、牛肉串差不多,在吃羊肉串的时候,有的人习惯一口一串,从签子底部用嘴一划,所有的肉都被收进嘴里, 而我看到一些女生,吃羊肉串非常斯文, 她会先用筷子把一块肉挑到碗里再吃。
字符串也可以一个个字符的取,大多数情况下,都可以使用索引方式得到某个单一字符。索引的作用是取出一个字符,索引从0开始
man = "kang li" print(man[1]) #a print(man[0]) #k
索引可以是负数,表示倒数第几个,也就是从字符串的右边数到左边。索引为 -1 表示获取倒数第一个字符,索引为 -2 表示获取倒数第二个字符。为什么正序数的索引从 0 开始,倒序就不能从 0 开始呢?因为索引为 0 不能同时表示两个字符,会造成指令的冲突。
print(man[-1]) #i
超出索引范围报 IndexError 错误
print(man[8])
字符串截取
索引一次只能获取一个字符,切片可以一次获取多个。如果想获取字符串的某些子串,可以通过切片实现。切片的表示方法是: ​var[start: end]​
。 start 表示开始位置的索引号,end 表示结束位置的索引号, 但是不包含 end。
girl = "Smile沫沫" part_of_girl = girl[0:1] print(part_of_girl) # S
切片的索引号也可以是负数,但是在使用的时候要确保 end 是在 start 的右边,end - start > 0 。
girl = "Smile沫沫" print(girl[0: -2]) # Smile print(girl[-2: -4]) # 空字符串,取不到字符
切片的索引号超出范围是不会报错的,取到尽头为止。
girl = "Smile沫沫" print(girl[0:100000000000])
切片的 start 和 end 都可以省略。
girl[1:] girl[:-1] girl[:]
切片可以加第三个参数, ​girl[start:end:step]​
, 其实使用切片时,默认的步长是为 1。
girl[0:3:2]
字符串逆序输出
步长为 -1,表示从后面往前面数,girl[::-1], 反转字符串。
girl[::-1]
获取字符串长度
len(girl)
字符串格式化
格式化相当于一个模板,模板中有些空位需要动态的填入数据。
image-20210903164914851
from_name = '张三' title = '学费' money = 500 to_name = '李四' info = f""" 今天收到 {from_name} 交 来 {title} 人民币 {money} 元 收款人 {to_name} """
更高级的字符串模板可以使用 template, 它主要防止用户输入对程序安全造成影响。 一般我们在web开发中的模板渲染就是基于这种技术。
字符串分割
split 通过某个分隔符分割字符串,分割后得到一个列表。 如果没有指定分隔符,则把整个字符串作为唯一的元素存放到列表中。
girls = 'Lucy-Monic-Jessy' girl_list = girls.split('-') print(girl_list) # ['Lucy', 'Monic', 'Jessy'] girl_list = girls.split() print(girl_list) # ['Lucy-Monic-Jessy']
字符串拼接
join 方法是 split 的反向应用,它可以把一个列表通过特定的连接符组成一个字符串。
a = ['hello', 'world'] b = "".join(a) print(b)
字符串查找
通常,可以使用 find 或者 index 来查找简单的字符:
a = "hello world"a.find("he")
但是如果涉及到复杂的匹配规则,一般会用正则表达式。
字符串匹配
正则表达式非常枯燥,在没有具体的实战场景前,建议不用花太多时间提前了解,不然时间花了,没几天又忘得一干二净。这里简单写一个匹配规则, 表示匹配一个数字。
import restring = "ayu7o99"re.search("\d", string)
字符串替换
replace 替换某个子串。但是原来的数据是不会发生变化的,而是把替换后的字符串用新的变量表示。
a = "Soul 小芳" b = a.replace("Soul", "灵魂歌手") print(b) # 灵魂歌手 小芳 print(a) # Soul 小芳
字符串删除某个字符
字符串是不可变的数据类型,并不能真的把某个字符删除,但是我们可以使用 replace 方法间接实现,把指定的字符串替换成空字符串。
a = "Soul 小芳" # 去掉 ou b = a.replace('ou', '')
自动化测试场景
1、使用 string 表示测试用例
username = 'jiubing1' password = '123456' age = 18 print("用户名", username) print("密码", username) print("年龄", username)
2、去掉 username 的空格
username = 'jiubing1' first, last= username.split(' ') username = ''.join([first, last])
3、格式化输出
user = f""" ------------------------- 用户名:{username} 密码:{password} 年龄:{age} ------------------------- """
4、通过 input 打印出测试用例(模拟前端页面)
5、访问网址拼接
url = '' full_url = f'{url}?username={username}&password={password}&age={age}'
6、通过网址获取所有参数(后面的内容)
url, params = full_url.split('?') info = dict() for param in params.split('&'): key, value = param.split('=') info.update({key:value}) print(info)
我是九柄,全网同号,下次再聊。
Original: https://blog.51cto.com/u_12188579/5616320
Author: 九柄聊测试
Title: Python自学教程5-字符串有哪些常用操作
相关阅读3
Title: tunm二进制协议在python上的实现
tunm是一种对标JSON的二进制协议, 支持JSON的所有类型的动态组合
支持的数据类型
基本支持的类型 "u8", "i8", "u16", "i16", "u32", "i32", "u64", "i64", "varint", "float", "string", "raw", "array", "map"
为什么我们需要二进制协议
下图是文本格式JSON与tunm的对比
类型 可读 可编辑 编码速度 解码速度 数据大小 预定义 JSON ✓ ✓ 慢 慢 大 否 tunm x x 快 快 小 否 protobuf x x 快 快 小 是
在高性能的场景下, 或者需要流量传输比较敏感的地方, 通常会选择二进制来代替文本协议来做为通讯的, 如RPC, REST, 游戏等情况。
相对于google protobuf, 它需要比较完善的预定义过程, 就比如客户端版本1, 服务端版本2, 就有比较大的可能造成不兼容, 对需求经常变化的就会比较难与同步。
tunm相对于JSON, 若第一版是
{
"name": "tunm", "version": 1
}
此时第二版需要加入用户的id, 就可以很方便的变成
{
"name": "tunm", "version": 2, "id": 1
}
而对客户端1来说, 只是多一个id的字段, 不会有任何的破坏, 做到版本升级而无影响
协议的二进制格式
数据协议分为三部分(协议名称, 字符串索引区, 数据区(默认为数组))
如数据协议名为cmd_test_op, 数据为["tunm_proto", {"name": "tunm_proto", "tunm_proto": 1}]
协议的实现(小端对齐)
ByteBuffer具有组装字节流的功能, 比如写入字符串, 写入int, 还有里面存储字符串索引区
class ByteBuffer(object):
def __init__(self):
# 字节缓冲区
self.buffer = bytearray([00]*1024)
# 写入的位置索引号
self.wpos = 0
# 读出的位置索引号
self.rpos = 0
# 大小端格式
self.endianness = "little"
# 索引的数组及快速查询的字符串索引号
self.str_arr = []
self.str_map = {}
@enum.unique
class TP_DATA_TYPE(IntEnum):
TYPE_NIL = 0,
TYPE_BOOL = 1,
TYPE_U8 = 2,
TYPE_I8 = 3,
TYPE_U16 = 4,
TYPE_I16 = 5,
TYPE_U32 = 6,
TYPE_I32 = 7,
TYPE_U64 = 8,
TYPE_I64 = 9,
TYPE_VARINT = 10,
TYPE_FLOAT = 11,
TYPE_DOUBLE = 12,
TYPE_STR = 13,
TYPE_STR_IDX = 14,
TYPE_RAW = 15,
TYPE_ARR = 16,
TYPE_MAP = 17,
@staticmethod
def encode_varint(buffer: ByteBuffer, value):
'''
如果原数值是正数则将原数值变成value*2
如果原数值是负数则将原数值变成-(value + 1) * 2 + 1
相当于0->0, -1->1, 1->2,-2->3,2->4来做处理
因为小数值是常用的, 所以保证小数值及负数的小数值尽可能的占少位
'''
if type(value) == bool:
value = 1 if value else 0
real = value * 2
if value < 0:
real = -(value + 1) * 2 + 1
for _i in range(12):
# 每个字节的最高位来表示有没有下一位, 若最高位为0, 则已完毕
b = real & 0x7F
real >>= 7
if real > 0:
buffer.write_u8(b | 0x80)
else:
buffer.write_u8(b)
break
@staticmethod
def encode_str_idx(buffer: ByteBuffer, value):
'''
写入字符串索引值, 在数值区里的所有字符串默认会被写成索引值
如果重复的字符串则会返回相同的索引值(varint)
'''
idx = buffer.add_str(value)
TPPacker.encode_type(buffer, TP_DATA_TYPE.TYPE_STR_IDX)
TPPacker.encode_varint(buffer, idx)
@staticmethod
def encode_field(buffer: ByteBuffer, value, pattern=None):
'''
先写入类型的值(u8), 则根据类型写入类型对应的的数据
'''
if not pattern:
pattern = TPPacker.get_type_by_ref(value)
if pattern == TP_DATA_TYPE.TYPE_NIL:
return None
elif pattern == TP_DATA_TYPE.TYPE_BOOL:
TPPacker.encode_type(buffer, pattern)
TPPacker.encode_bool(buffer, value)
elif pattern >= TP_DATA_TYPE.TYPE_U8 and pattern = TP_DATA_TYPE.TYPE_U16 and pattern
@staticmethod
def encode_proto(buffer: ByteBuffer, name, infos):
'''
写入协议名称, 然后写入字符串索引区(即字符串数组), 然后再写入协议的详细数据
'''
sub_buffer = ByteBuffer()
TPPacker.encode_field(sub_buffer, infos)
TPPacker.encode_str_raw(buffer, name, TP_DATA_TYPE.TYPE_STR)
TPPacker.encode_varint(buffer, len(sub_buffer.str_arr))
for val in sub_buffer.str_arr:
TPPacker.encode_str_raw(buffer, val, TP_DATA_TYPE.TYPE_STR)
buffer.write_bytes(sub_buffer.all_bytes())
Original: https://www.cnblogs.com/luojiawaf/p/16411608.html
Author: 行稳致远up
Title: tunm二进制协议在python上的实现