当前位置 博文首页 > 总结几个非常实用的Python库

    总结几个非常实用的Python库

    作者:程序员唐丁 时间:2021-08-05 18:16

    自带库

    一、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库后面唐丁再给大家一一介绍

    jsjbwy
    下一篇:没有了