总结几个非常实用的Python库

自带库

一、datetime

datetime是Python处理日期和时间的标准库。

1、获取当前日期和时间

>>> from datetime import datetime

>>> now = datetime.now()

>>> print(now)

2021-06-14 09:33:10.460192

>>> print(type(now))

<class \'datetime.datetime\'>

2、获取指定日期和时间

>>> from datetime import datetime

>>> dt = datetime(2021,6,10,12,0)

>>> print(dt)

2021-06-10 12:00:00

3、datetime转换为timestamp

在计算机中,时间实际上是用数字表示的。我们把1970年1月1日 00:00:00 UTC+00:00时区的时刻称为epoch time,记为0(1970年以前的时间timestamp为负数),当前时间就是相对于epoch time的秒数,称为timestamp(时间戳)。

>>> from datetime import datetime

>>> now = datetime.now()

>>> now

datetime.datetime(2021, 6, 14, 9, 38, 34, 969006)

>>> now.timestamp()	#把datetime转换为timestamp

1623634714.969006

4、timestamp转换为datetime

>>> from datetime import datetime

>>> timestamp = 1623634714.969006

>>> print(datetime.fromtimestamp(timestamp))

2021-06-14 09:38:34.969006

5、str转换为datetime

>>> from datetime import datetime

>>> day = datetime.strptime(\'2021-6-10 12:12:12\',\'%Y-%m-%d %H:%M:%S\')

>>> print(day)

2021-06-10 12:12:12

6、datetime转换为str

>>> from datetime import datetime

>>> now = datetime.now()

>>> print(now)

2021-06-14 09:49:02.281820

>>> print(type(now))

<class \'datetime.datetime\'>

>>> str_day = now.strftime(\'%Y-%m-%d %H:%M:%S\')

>>> print(str_day)

2021-06-14 09:49:02

>>> print(type(str_day))

<class \'str\'>

二、collections

collections是Python内建的一个集合模块,提供了许多有用的集合类,其中统计功能非常实用。

Counter

Counter是一个简单的计数器,例如,统计字符出现的个数

>>> from collections import Counter

>>> c = Counter()

>>> str = \'jdkjefwnewnfjqbefbqbefqbferbb28934`83278784727\'

>>> c.update(str)

>>> c

Counter({\'b\': 6, \'e\': 5, \'f\': 5, \'8\': 4, \'7\': 4, \'j\': 3, \'q\': 3, \'2\': 3, \'w\': 2, \'n\': 2, \'3\': 2, \'4\': 2, \'d\': 1, \'k\': 1, \'r\': 1, \'9\': 1, \'`\': 1})

三、base64

Base64是一种用64个字符来表示任意二进制数据的方法。

用记事本打开exejpgpdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。Base64是一种最常见的二进制编码方法。

>>> import base64
>>> base64.b64encode(b\'binary\\x00string\')
b\'YmluYXJ5AHN0cmluZw==\'
>>> base64.b64decode(b\'YmluYXJ5AHN0cmluZw==\')
b\'binary\\x00string\'

四、hashlib

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

我们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:

>>> import hashlib

>>> md5 = hashlib.md5()

>>> md5.update(\"程序员唐丁\".encode(\'utf-8\'))

>>> print(md5.hexdigest())

05eb21a61d2cf0cf84e474d859c4c055

摘要算法能应用到什么地方?举个常用例子:

任何允许用户登录的网站都会存储用户登录的用户名和口令。如何存储用户名和口令呢?方法是存到数据库表中。如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如MD5,当用户登录时,首先计算用户输入的明文口令的MD5,然后和数据库存储的MD5对比,如果一致,说明口令输入正确,如果不一致,口令肯定错误。

第三方库

一、requests

requests是一个Python第三方库,处理URL资源特别方便。在之前的”爬虫简介“文章中我们已经初步认识了它。

1、安装requests

如果安装了Anaconda,requests就已经可用了。否则,需要在命令行下通过pip安装:

$ pip install requests

如果遇到Permission denied安装失败,请加上sudo重试。

2、通过GET访问豆瓣首页,只需要几行代码:

>>> import requests
>>> r = requests.get(\'https://www.douban.com/\') # 豆瓣首页
>>> r.status_code
200
>>> r.text
r.text
\'<!DOCTYPE HTML>\\n<html>\\n<head>\\n<meta name=\"description\" content=\"提供图书、电影、音乐唱片的推荐、评论和...\'

3、对于带参数的URL,传入一个dict作为params参数:

>>> r = requests.get(\'https://www.douban.com/search\', params={\'q\': \'python\', \'cat\': \'1001\'})
>>> r.url # 实际请求的URL
\'https://www.douban.com/search?q=python&cat=1001\'

4、requests自动检测编码,可以使用encoding属性查看:

>>> r.encoding
\'utf-8\'

5、无论响应是文本还是二进制内容,我们都可以用content属性获得bytes对象:

>>> r.content
b\'<!DOCTYPE html>\\n<html>\\n<head>\\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\\n...\'

6、requests的方便之处还在于,对于特定类型的响应,例如JSON,可以直接获取:

>>> r = requests.get(\'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20%3D%202151330&format=json\')
>>> r.json()
{\'query\': {\'count\': 1, \'created\': \'2017-11-17T07:14:12Z\', ...

7、需要传入HTTP Header时,我们传入一个dict作为headers参数:

>>> r = requests.get(\'https://www.douban.com/\', headers={\'User-Agent\': \'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit\'})
>>> r.text
\'<!DOCTYPE html>\\n<html>\\n<head>\\n<meta charset=\"UTF-8\">\\n <title>豆瓣(手机版)</title>...\'

8、要发送POST请求,只需要把get()方法变成post(),然后传入data参数作为POST请求的数据:

>>> r = requests.post(\'https://accounts.douban.com/login\', data={\'form_email\': \'abc@example.com\', \'form_password\': \'123456\'})

9、requests默认使用application/x-www-form-urlencoded对POST数据编码。如果要传递JSON数据,可以直接传入json参数:

params = {\'key\': \'value\'}
r = requests.post(url, json=params) # 内部自动序列化为JSON

10、类似的,上传文件需要更复杂的编码格式,但是requests把它简化成files参数:

>>> upload_files = {\'file\': open(\'report.xls\', \'rb\')}
>>> r = requests.post(url, files=upload_files)

在读取文件时,注意务必使用\'rb\'即二进制模式读取,这样获取的bytes长度才是文件的长度。

post()方法替换为put()delete()等,就可以以PUT或DELETE方式请求资源。

11、除了能轻松获取响应内容外,requests对获取HTTP响应的其他信息也非常简单。例如,获取响应头:

>>> r.headers
{Content-Type\': \'text/html; charset=utf-8\', \'Transfer-Encoding\': \'chunked\', \'Content-Encoding\': \'gzip\', ...}
>>> r.headers[\'Content-Type\']
\'text/html; charset=utf-8\'

12、requests对Cookie做了特殊处理,使得我们不必解析Cookie就可以轻松获取指定的Cookie:

>>> r.cookies[\'ts\']
\'example_cookie_12345\'

13、要在请求中传入Cookie,只需准备一个dict传入cookies参数:

>>> cs = {\'token\': \'12345\', \'status\': \'working\'}
>>> r = requests.get(url, cookies=cs)

14、最后,要指定超时,传入以秒为单位的timeout参数:

>>> r = requests.get(url, timeout=2.5) # 2.5秒后超时

二、chardet

字符串编码一直是令人非常头疼的问题,尤其是我们在处理一些不规范的第三方网页的时候。虽然Python提供了Unicode表示的strbytes两种数据类型,并且可以通过encode()decode()方法转换,但是,在不知道编码的情况下,对bytesdecode()不好做。

对于未知编码的bytes,要把它转换成str,需要先“猜测”编码。猜测的方式是先收集各种编码的特征字符,根据特征字符判断,就能有很大概率“猜对”。

当然,我们肯定不能从头自己写这个检测编码的功能,这样做费时费力。chardet这个第三方库正好就派上了用场。用它来检测编码,简单易用。

1、安装chardet

如果安装了Anaconda,chardet就已经可用了。否则,需要在命令行下通过pip安装:

$ pip install chardet

如果遇到Permission denied安装失败,请加上sudo重试。

2、当我们拿到一个bytes时,就可以对其检测编码。用chardet检测编码,只需要一行代码:

>>> chardet.detect(b\'Hello, world!\')
{\'encoding\': \'ascii\', \'confidence\': 1.0, \'language\': \'\'}

三、psutil

用Python来编写脚本简化日常的运维工作是Python的一个重要用途。在Linux下,有许多系统命令可以让我们时刻监控系统运行的状态,如pstopfree等等。要获取这些系统信息,Python可以通过subprocess模块调用并获取结果。但这样做显得很麻烦,尤其是要写很多解析代码。

在Python中获取系统信息的另一个好办法是使用psutil这个第三方模块,它不仅可以通过一两行代码实现系统监控,还可以跨平台使用,支持Linux/UNIX/OSX/Windows等,是系统管理员和运维小伙伴不可或缺的必备模块。

1、安装psutil

如果安装了Anaconda,psutil就已经可用了。否则,需要在命令行下通过pip安装:

$ pip install psutil

如果遇到Permission denied安装失败,请加上sudo重试。

2、获取CPU信息

我们先来获取CPU的信息:

>>> import psutil
>>> psutil.cpu_count() # CPU逻辑数量
4
>>> psutil.cpu_count(logical=False) # CPU物理核心
2
# 2说明是双核超线程, 4则是4核非超线程

3、统计CPU的用户/系统/空闲时间:

>>> psutil.cpu_times()
scputimes(user=10963.31, nice=0.0, system=5138.67, idle=356102.45)

4、获取内存信息

使用psutil获取物理内存和交换内存信息,分别使用:

>>> psutil.virtual_memory()
svmem(total=8589934592, available=2866520064, percent=66.6, used=7201386496, free=216178688, active=3342192640, inactive=2650341376, wired=1208852480)
>>> psutil.swap_memory()
sswap(total=1073741824, used=150732800, free=923009024, percent=14.0, sin=10705981440, sout=40353792)

返回的是字节为单位的整数,可以看到,总内存大小是8589934592 = 8 GB,已用7201386496 = 6.7 GB,使用了66.6%。

而交换区大小是1073741824 = 1 GB。

5、获取磁盘信息

可以通过psutil获取磁盘分区、磁盘使用率和磁盘IO信息:

>>> psutil.disk_partitions() # 磁盘分区信息
[sdiskpart(device=\'/dev/disk1\', mountpoint=\'/\', fstype=\'hfs\', opts=\'rw,local,rootfs,dovolfs,journaled,multilabel\')]
>>> psutil.disk_usage(\'/\') # 磁盘使用情况
sdiskusage(total=998982549504, used=390880133120, free=607840272384, percent=39.1)
>>> psutil.disk_io_counters() # 磁盘IO
sdiskio(read_count=988513, write_count=274457, read_bytes=14856830464, write_bytes=17509420032, read_time=2228966, write_time=1618405)

好了,就先介绍这么多吧,更多实用的Python库后面唐丁再给大家一一介绍

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容