一分钟了解几个非常实用的Python库
Posted 程序员唐丁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一分钟了解几个非常实用的Python库相关的知识,希望对你有一定的参考价值。
Python一直被自称“batteries included”,就是因为内置了许多非常有用的模块,无需额外安装和配置,即可直接使用。
除了内建的模块外,Python还有大量的第三方模块,直接使用pip安装即可使用。下面给大家简单介绍几个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个字符来表示任意二进制数据的方法。
用记事本打开exe
、jpg
、pdf
这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。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表示的str
和bytes
两种数据类型,并且可以通过encode()
和decode()
方法转换,但是,在不知道编码的情况下,对bytes
做decode()
不好做。
对于未知编码的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下,有许多系统命令可以让我们时刻监控系统运行的状态,如ps
,top
,free
等等。要获取这些系统信息,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库后面唐丁再给大家一一介绍~~
以上是关于一分钟了解几个非常实用的Python库的主要内容,如果未能解决你的问题,请参考以下文章