初探Python标准库~【八个自带模块的妙用】

简介: 初探Python标准库~【八个自带模块的妙用】

前言
Python语言最可爱的地方在于它的标准库和三方库实在是太丰富了,日常开发工作中的很多任务都可以通过这些标准库或者三方库直接解决。下面我们先介绍Python标准库中的一些常用模块,后面我们再陆陆续续为大家介绍Python常用三方库的用途和用法。

目录
前言
base64 - Base64编解码模块
collections - 容器数据类型模块
hashlib - 哈希函数模块
heapq - 堆排序模块
itertools - 迭代工具模块
random - 随机数和随机抽样模块
os.path - 路径操作相关模块
uuid - UUID生成模块
总结
base64 - Base64编解码模块
Base64是一种基于64个可打印字符来表示二进制数据的方法。由于l o g 2 64 = 6 log _{2}64=6log
2

64=6,所以Base64以6个比特(二进制位,可以表示0或1)为一个单元,每个单元对应一个可打印字符。对于3字节(24比特)的二进制数据,我们可以将其处理成对应于4个Base64单元,即3个字节可由4个可打印字符来表示。
Base64编码可用来作为电子邮件的传输编码,也可以用于其他需要将二进制数据转成文本字符的场景,这使得在XML、JSON、YAML这些文本数据格式中传输二进制内容成为可能。在Base64中的可打印字符包括A-Z、a-z、0-9,这里一共是62个字符,另外两个可打印符号通常是+和/,=用于在Base64编码最后进行补位。

关于Base64编码的细节,大家可以参考《Base64笔记》一文,Python标准库中的base64模块提供了b64encode和b64decode两个函数,专门用于实现Base64的编码和解码,下面演示了在Python的交互式环境中执行这两个函数的效果。

import base64

content = 'Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.'
base64.b64encode(content.encode())
b'TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4='
content = b'TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4='
base64.b64decode(content).decode()
'Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.'
1
2
3
4
5
6
7
8
collections - 容器数据类型模块
collections模块提供了诸多非常好用的数据结构,主要包括:

namedtuple:命令元组,它是一个类工厂,接受类型的名称和属性列表来创建一个类。
deque:双端队列,是列表的替代实现。Python中的列表底层是基于数组来实现的,而deque底层是双向链表,因此当你需要在头尾添加和删除元素是,deque会表现出更好的性能,渐近时间复杂度为O ( 1 ) O(1)O(1)。
Counter:dict的子类,键是元素,值是元素的计数,它的most_common()方法可以帮助我们获取出现频率最高的元素。Counter和dict的继承关系我认为是值得商榷的,按照CARP原则,Counter跟dict的关系应该设计为关联关系更为合理。
OrderedDict:dict的子类,它记录了键值对插入的顺序,看起来既有字典的行为,也有链表的行为。
defaultdict:类似于字典类型,但是可以通过默认的工厂函数来获得键对应的默认值,相比字典中的setdefault()方法,这种做法更加高效。

下面是在Python交互式环境中使用namedtuple创建扑克牌类的例子。

from collections import namedtuple

Card = namedtuple('Card', ('suite', 'face'))
card1 = Card('红桃', 5)
card2 = Card('草花', 9)
card1
Card(suite='红桃', face=5)
card2
Card(suite='草花', face=9)
print(f'{card1.suite}{card1.face}')
红桃5
print(f'{card2.suite}{card2.face}')
草花9
1
2
3
4
5
6
7
8
9
10
11
12
13
下面是使用Counter类统计列表中出现次数最多的三个元素的例子。

from collections import Counter

words = [

'look', 'into', 'my', 'eyes', 'look', 'into', 'my', 'eyes',
'the', 'eyes', 'the', 'eyes', 'the', 'eyes', 'not', 'around',
'the', 'eyes', "don't", 'look', 'around', 'the', 'eyes',
'look', 'into', 'my', 'eyes', "you're", 'under'

]
counter = Counter(words)

打印words列表中出现频率最高的3个元素及其出现次数

for elem, count in counter.most_common(3):

print(elem, count)

1
2
3
4
5
6
7
8
9
10
11
12
hashlib - 哈希函数模块
哈希函数又称哈希算法或散列函数,是一种为已有的数据创建“数字指纹”(哈希摘要)的方法。哈希函数把数据压缩成摘要,对于相同的输入,哈希函数可以生成相同的摘要(数字指纹),需要注意的是这个过程并不可逆(不能通过摘要计算出输入的内容)。一个优质的哈希函数能够为不同的输入生成不同的摘要,出现哈希冲突(不同的输入产生相同的摘要)的概率极低,MD5、SHA家族就是这类好的哈希函数。

说明:在2011年的时候,RFC 6151中已经禁止将MD5用作密钥散列消息认证码,这个问题不在我们讨论的范围内。

Python标准库的hashlib模块提供了对哈希函数的封装,通过使用md5、sha1、sha256等类,我们可以轻松的生成“数字指纹”。举一个简单的例子,用户注册时我们希望在数据库中保存用户的密码,很显然我们不能将用户密码直接保存在数据库中,这样可能会导致用户隐私的泄露,所以在数据库中保存用户密码时,通常都会将密码的“指纹”保存起来,用户登录时通过哈希函数计算密码的“指纹”再进行匹配来判断用户登录是否成功。

import hashlib

计算字符串"123456"的MD5摘要

print(hashlib.md5('123456'.encode()).hexdigest())

计算文件"Python-3.7.1.tar.xz"的MD5摘要

hasher = hashlib.md5()
with open('Python-3.7.1.tar.xz', 'rb') as file:

data = file.read(512)
while data:
    hasher.update(data)
    data = file.read(512)

print(hasher.hexdigest())
1
2
3
4
5
6
7
8
9
10
11
12
13
说明:很多网站在下载链接的旁边都提供了哈希摘要,完成文件下载后,我们可以计算该文件的哈希摘要并检查它与网站上提供的哈希摘要是否一致(指纹比对)。如果计算出的哈希摘要与网站提供的并不一致,很有可能是下载出错或该文件在传输过程中已经被篡改,这时候就不应该直接使用这个文件。

heapq - 堆排序模块
heapq模块实现了堆排序算法,如果希望使用堆排序,尤其是要解决TopK问题(从序列中找到K个最大或最小元素),直接使用该模块即可,代码如下所示。

import heapq

list1 = [34, 25, 12, 99, 87, 63, 58, 78, 88, 92]

找出列表中最大的三个元素

print(heapq.nlargest(3, list1))

找出列表中最小的三个元素

print(heapq.nsmallest(3, list1))

list2 = [

{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'AAPL', 'shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09},
{'name': 'HPQ', 'shares': 35, 'price': 31.75},
{'name': 'YHOO', 'shares': 45, 'price': 16.35},
{'name': 'ACME', 'shares': 75, 'price': 115.65}

]

找出价格最高的三只股票

print(heapq.nlargest(3, list2, key=lambda x: x['price']))

找出持有数量最高的三只股票

print(heapq.nlargest(3, list2, key=lambda x: x['shares']))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

itertools - 迭代工具模块
itertools可以帮助我们生成各种各样的迭代器,大家可以看看下面的例子。

import itertools

产生ABCD的全排列

for value in itertools.permutations('ABCD'):

print(value)

产生ABCDE的五选三组合

for value in itertools.combinations('ABCDE', 3):

print(value)

产生ABCD和123的笛卡尔积

for value in itertools.product('ABCD', '123'):

print(value)

产生ABC的无限循环序列

it = itertools.cycle(('A', 'B', 'C'))
print(next(it))
print(next(it))
print(next(it))
print(next(it))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
random - 随机数和随机抽样模块
这个模块我们之前已经用过很多次了,生成随机数、实现随机乱序和随机抽样,下面是常用函数的列表。

getrandbits(k):返回具有k个随机比特位的整数。
randrange(start, stop[, step]):从range(start, stop, step) 返回一个随机选择的元素,但实际上并没有构建一个range对象。
randint(a, b):返回随机整数N满足a <= N <= b,相当于randrange(a, b+1)。
choice(seq):从非空序列seq返回一个随机元素。 如果seq为空,则引发IndexError。
choices(population, weight=None, *, cum_weights=None, k=1):从population中选择替换,返回大小为k的元素列表。 如果population为空,则引发IndexError。
shuffle(x[, random]):将序列x随机打乱位置。
sample(population, k):返回从总体序列或集合中选择k个不重复元素构造的列表,用于无重复的随机抽样。
random():返回[0.0, 1.0)范围内的下一个随机浮点数。
expovariate(lambd):指数分布。
gammavariate(alpha, beta):伽玛分布。
gauss(mu, sigma) / normalvariate(mu, sigma):正态分布。
paretovariate(alpha):帕累托分布。
weibullvariate(alpha, beta):威布尔分布。

os.path - 路径操作相关模块
os.path模块封装了操作路径的工具函数,如果程序中需要对文件路径做拼接、拆分、获取以及获取文件的存在性和其他属性,这个模块将会非常有帮助,下面为大家罗列一些常用的函数。

dirname(path):返回路径path的目录名称。
exists(path):如果path指向一个已存在的路径或已打开的文件描述符,返回 True。
getatime(path) / getmtime(path) / getctime(path):返回path的最后访问时间/最后修改时间/创建时间。
getsize(path):返回path的大小,以字节为单位。如果该文件不存在或不可访问,则抛出OSError异常。
isfile(path):如果path是普通文件,则返回 True。
isdir(path):如果path是目录(文件夹),则返回True。
join(path, *paths):合理地拼接一个或多个路径部分。返回值是path和paths所有值的连接,每个非空部分后面都紧跟一个目录分隔符 (os.sep),除了最后一部分。这意味着如果最后一部分为空,则结果将以分隔符结尾。如果参数中某个部分是绝对路径,则绝对路径前的路径都将被丢弃,并从绝对路径部分开始连接。
splitext(path):将路径path拆分为一对,即(root, ext),使得root + ext == path,其中ext为空或以英文句点开头,且最多包含一个句点。

uuid - UUID生成模块
uuid模块可以帮助我们生成全局唯一标识符(Universal Unique IDentity)。该模块提供了四个用于生成UUID的函数,分别是:

uuid1():由MAC地址、当前时间戳、随机数生成,可以保证全球范围内的唯一性。
uuid3(namespace, name):通过计算命名空间和名字的MD5哈希摘要(“指纹”)值得到,保证了同一命名空间中不同名字的唯一性,和不同命名空间的唯一性,但同一命名空间的同一名字会生成相同的UUID。
uuid4():由伪随机数生成UUID,有一定的重复概率,该概率可以计算出来。
uuid5():算法与uuid3相同,只不过哈希函数用SHA-1取代了MD5。
由于uuid4存在概率型重复,那么在真正需要全局唯一标识符的地方最好不用使用它。在分布式环境下,uuid1是很好的选择,因为它能够保证生成ID的全局唯一性。下面是在Python交互式环境中使用uuid1函数生成全局唯一标识符的例子。

import uuid
uuid.uuid1().hex
'622a8334baab11eaaa9c60f81da8d840'
uuid.uuid1().hex
'62b066debaab11eaaa9c60f81da8d840'
uuid.uuid1().hex
'642c0db0baab11eaaa9c60f81da8d840'
1
2
3
4
5
6
7
目录
相关文章
|
2天前
|
Python
【Python进阶(五)】——模块搜索及工作目录
【Python进阶(五)】——模块搜索及工作目录
|
4天前
|
XML 前端开发 数据格式
BeautifulSoup 是一个 Python 库,用于从 HTML 和 XML 文件中提取数据
BeautifulSoup 是 Python 的一个库,用于解析 HTML 和 XML 文件,即使在格式不规范的情况下也能有效工作。通过创建 BeautifulSoup 对象并使用方法如 find_all 和 get,可以方便地提取和查找文档中的信息。以下是一段示例代码,展示如何安装库、解析 HTML 数据以及打印段落、链接和特定类名的元素。BeautifulSoup 还支持更复杂的查询和文档修改功能。
11 1
|
1天前
|
机器学习/深度学习 数据挖掘 PyTorch
10个非常有用的Python库,你知道几个?
这些库覆盖了数据科学、机器学习、Web开发和其他领域,使Python成为一个多用途的编程语言。它们在各种项目和领域中都非常有用。
15 2
|
1天前
|
Python
在Python中,利用`os模块`的`path.exists()`函数可判断文件是否存
在Python中,利用`os模块`的`path.exists()`函数可判断文件是否存在,该函数对路径进行检查,存在则返回True,不存在则返回False。示例代码展示了如何检查&#39;example.txt&#39;文件是否存在并相应打印消息。此外,`os.path.isfile()`用于确认路径是否为文件,仅当是文件时返回True,否则返回False,同样配以示例说明其用法。
8 2
|
1天前
|
SQL 关系型数据库 数据库连接
使用 Python 访问数据库的基本方法
【5月更文挑战第12天】在Python中操作数据库涉及安装数据库驱动(如mysql-connector-python, psycopg2, pymongo)、连接数据库、执行查询/更新、处理结果集及关闭连接。使用ORM(如SQLAlchemy)可简化操作。通过上下文管理器(with语句)能更好地管理资源和错误。注意根据实际需求处理事务、错误和安全性,例如使用SSL连接。
11 2
|
2天前
|
JSON 监控 调度
局域网管理软件的自动化任务调度:Python 中的 APScheduler 库的应用
使用 Python 的 APScheduler 库可简化局域网管理中的自动化任务调度。APScheduler 是一个轻量级定时任务调度库,支持多种触发方式如间隔、时间、日期和 Cron 表达式。示例代码展示了如何创建每 10 秒执行一次的定时任务。在局域网管理场景中,可以利用 APScheduler 定期监控设备状态,当设备离线时自动提交数据到网站,提升管理效率。
16 0
|
3天前
|
数据采集 数据可视化 数据挖掘
如何利用Python中的Pandas库进行数据分析和可视化
Python的Pandas库是一种功能强大的工具,可以用于数据分析和处理。本文将介绍如何使用Pandas库进行数据分析和可视化,包括数据导入、清洗、转换以及基本的统计分析和图表绘制。通过学习本文,读者将能够掌握利用Python中的Pandas库进行高效数据处理和可视化的技能。
|
4天前
|
Python Windows
python中的异常与模块
python中的异常与模块
10 1
|
4天前
|
机器学习/深度学习 自然语言处理 算法
Gensim详细介绍和使用:一个Python文本建模库
Gensim详细介绍和使用:一个Python文本建模库
15 1
|
5天前
|
JSON 数据格式 Python
Python 的 requests 库是一个强大的 HTTP 客户端库,用于发送各种类型的 HTTP 请求
`requests` 库是 Python 中用于HTTP请求的强大工具。要开始使用,需通过 `pip install requests` 进行安装。发送GET请求可使用 `requests.get(url)`,而POST请求则需结合 `json.dumps(data)` 以JSON格式发送数据。PUT和DELETE请求类似,分别调用 `requests.put()` 和 `requests.delete()`。
14 2