22 个最常用的Python包

[复制链接]
查看839 | 回复2 | 2020-4-5 07:13:38 | 显示全部楼层 |阅读模式
优质文章,第一时间送达!




作者 | Erik-Jan van Baaren

谋划  | 万佳

出处 | 架构头条

全球各地的法度模范   员都是怎样使用 Python?

我们从最常用的 Python 包入手,去解答上述这个问题。最初,我列出曩昔 一年在 PyPI 上下载次数最多的 Python 包。接下来,深入研究其用途、它们之间的关系和它们备受欢迎的原因。

1 Urllib3

下载次数:8.93 亿

Urllib3是一个 Python 的 HTTP 客户端,它拥有 Python 标准  库中缺少的许多功能  :
    线程平安 连接池客户端 SSL/TLS 验证使用分段编码上传文件用来重试请求和处理   HTTP 重定向的助手支持 gzip 和 deflate 编码HTTP 和 SOCKS 的署理 支持

不要被名字所误导,Urllib3并不是urllib2的后继者,而后  者是 Python 核心的一部分  。如果你想使用尽可能多的 Python 核心功能  ,或者你能安装什么器械 是受限,那么请查看 urlllib.request。

https://docs.python.org/3/library/urllib.request.html#module-urllib.request

对最终用户来说,我强烈建议使用 requests 包(参阅列表中的 #6)。这个包之所以会排名第一,是因为有差不多 1200 个包依赖 urllib3,其中许多包在这个列表中的排名也很高。

https://libraries.io/pypi/urllib3/dependents

2 Six

下载次数:7.32 亿

six 是一个是 Python 2 和 3 的兼容性库。这个项目旨在支持可同时运行在 Python 2 和 3 上的代码库。

它提供了许多可简化 Python 2 和 3 之间语法差别 的函数。一个容易理解的例子是six.print_。在 Python 3 中,打印是通过print函数完成的,而在 Python 2 中,print后面没有括号。因此,有了six.print_后,你就可以使用一个语句来同时支持两种语言。

一些事实:
    它的名字叫six,是因为二乘以三等于六。同类库还可以看看future包。如果你要将代码转换为 Python3(并停止支持 2),请查看 2to3。

虽然我理解它为什么这么受欢迎,但我希望人们能完全放弃   Python 2,因为要知道从 2020 年 1 月 1 日起 Python 2 的官方支持就已停止。

PyPI 页面

https://pypi.org/project/six/

文档

https://six.readthedocs.io/

3 botocore、boto3、s3transfer、awscli

这里,我把相关的几个项目列在一起:

botocore(#3,6.6 亿次下载)

s3transfer(#7,5.84 亿次下载)

awscli(#17,3.94 亿次下载)

boto3(#22,3.29 亿次下载)

Botocore是 AWS 的底层接口。Botocore是 Boto3 库(#22)的基础,后者让你可以使用 Amazon S3 和 Amazon EC2 一类的办事 。Botocore 还是 AWS-CLI 的基础,后者为 AWS 提供统一的命令行界面。

S3transfer(#7)是用于治理  Amazon S3 传输的 Python 库。它正在积极开发中,其介绍页面不推荐人们现在使用,或者至少等版本固定下来再用,因为其 API 可能产生 变更 ,在次要版本之间都可能更改。Boto3、AWS-CLI和其他许多项目都依赖s3transfer。

令人惊讶的是,这些针对 AWS 库的排名竟如此之高——这充分  说明了 AWS 有多厉害。

4 Pip

下载次数:6.27 亿




我想,你们年夜 多半 人都知道并且  很喜欢 pip,它是 Python 的包安装器。你可以用 pip 轻松地从 Python 包索引和其他索引(例如本地  镜像或带有私有软件的自界说 索引)来安装软件包。

有关 pip 的一些有趣事实:
    pip是“Pip Installs Packages”的首字母递归缩写。pip很容易使用。要安装一个包只需pip install 即可,而删除包只需pip uninstall 即可。最年夜 优点之一是它可以获取包列表,通常以requirements.txt文件的形式获取。该文件能选择包含  所需版本的详细规范。年夜 多半  Python 项目都包含  这样的文件。如果结合使用pip与virtualenv(列表中的 #57),就可以创建  可预测的隔离环境,同时不会干扰底层系统,反之亦然。要了解更多细节,请查看这篇文章:

https://medium.com/better-programming/stop-installing-python-packages-globally-use-virtual-environments-a31dee9fb2de

5 Python-dateutil

下载次数:6.17 亿

python-dateutil模块提供了对标准  datetime模块的强年夜 扩展。我的经验是,通例  的Python datetime缺少哪些功能  ,python-dateutil就能补足那一块。

你可以用这个库做很多很棒的事情。其中,我发明 的一个特别有用的功能  就是:模糊解析日志文件中的日期,例如:
from dateutil.parser import parse
logline = 'INFO 2020-01-01T00:00:01 Happy new year, human.'timestamp = parse(log_line, fuzzy=True)print(timestamp)# 2020-01-01 00:00:01

6 Requests

下载次数:6.11 亿

Requests建立在我们的 #1 库——urllib3基础上。它让 Web 请求变得异常 简单。相比urllib3来说,很多人更喜欢这个包。并且 使用它的最终用户可能也比urllib3更多。后者更偏底层,并且  考虑到它对内部的控制级别,它一般是作为其他项目的依赖项。

下面这个例子说明 requests 用起来有多简单:
import requests
r = requests.get('https://api.github.com/user', auth=('user', 'pass'))r.status_code# 200r.headers['content-type']# 'application/json; charset=utf8'r.encoding# 'utf-8'r.text# u'{"type":"User"...'r.json# {u'disk_usage': 368627, u'private_gists': 484, ...}

PyPI 页面

https://pypi.org/project/requests

文档

https://2.python-requests.org/en/master/

7 S3transfer

这里把 #3、#7、#17 和 #22 放在一起介绍,因为它们的关系异常 密切。

8 Certifi

下载次数:5.52 亿

近年来,几乎所有网站都转向 SSL,你可以通过地址栏中的小锁符号来识别它。加了小锁意味着与该站点的通信是平安 和加密的,能防止窃听行为。




小锁告诉  我们此网站已使用 SSL 掩护

加密进程 是基于 SSL 证书的,并且  这些 SSL 证书由受信任的公司或非营利组织(如 LetsEncrypt)创建  。这些组织使用他们的(中间)证书对这些证书进行数字签名。

你的浏览器使用这些证书的公开可用部分  来验证这些签名,这样就能确保你正查看的是真实内容,并且  没有人能窥探到通信数据。Python 软件也能做同样事情。这就是 certifi 的用途所在。它与 Chrome、Firefox 和 Edge 等网络浏览器随附的根证书集合没有太年夜 区别。

Certifi是根证书的一个精选集合,有了它,你的 Python 代码就能验证 SSL 证书的可信度。

如此处所  示,许多项目信任并依赖 certifi。这也是该项目排名如此之高的原因所在。

https://libraries.io/pypi/certifi/dependents

certifi PyPI 页面

https://pypi.org/project/certifi/

文档

https://certifiio.readthedocs.io/en/latest/

9 Idna

下载次数:5.27 亿

依据 其 PyPI 页面,idna提供了“对 RFC5891 中指定的应用法度模范   中国际化域名(IDNA)协议的支持。”

可能你像我一样也是一头雾水,不知道Idna是什么,有什么用!据悉,应用法度模范   中的国际化域名(IDNA)是一种用来处理  包含  非 ASCII 字符的域名机制。然则 ,原始域名系统已经提供对基于非 ASCII 字符的域名支持。所以,哪有问题?




问题在于应用法度模范   (例如电子邮件客户端和 Web 浏览器)不支持非 ASCII 字符。更具体地说,电子邮件和 HTTP 用的协议不支持这些字符。对许多国度 来说,这没什么问题,然则 像中国、俄罗斯、德国、希腊和印度尼西亚等国度 ,这是个问题。最后,来自这些处所 的一群聪慧 人想到 IDNA。

IDNA的核心是两个函数:ToASCII和ToUnicode。ToASCII会将国际 Unicode 域转换为 ASCII 字符串。ToUnicode则逆转该进程 。在IDNA包中,这些函数称为idna.encode和idna.decode,如以下代码片段所示:
import idnaidna.encode('ドメイン.テスト')# b'xn--eckwd4c7c.xn--zckzah'print(idna.decode('xn--eckwd4c7c.xn--zckzah'))# ドメイン.テスト

如果你是受虐狂,则可以阅读 RFC-3490 了解这一编码的详细信息。

PyPI 页面

https://pypi.org/project/idna/

GitHub 页面

https://github.com/kjd/idna

10 PyYAML

下载次数:5.25 亿

YAML是一种数据序列化格局 。它的设计宗旨是让人类和计算机都能很容易地阅读代码——人类很容易读写它的内容,计算机也可以解析它。




PyYAML是 Python 的YAML解析器和发射器,这意味着它可以读写YAML。它会把任何 Python 对象写成YAML:列表、字典,甚至是类实例都包含 在内。

Python 提供了自己的配置解析器,然则 与 Python 的ConfigParser的基本.ini文件结构相比,YAML 提供更多功能  。

https://docs.python.org/3/library/configparser.html

例如,YAML可以存储任何数据类型:布尔值、列表、浮点数等等。ConfigParser会将所有内容存储为内部字符串。如果要使用ConfigParser加载整数,则你需要指定自己要显式获取一个int:
config.getint(“section”, “my_int”)

pyyaml能自动识别类型,所以这将使用PyYAML返回你的int:
config[“section”][“my_int”]

YAML还允许任意的 deep trees,虽然不是每个项目都需要这种器械 ,然则 需要时,它就可以派上用场。你可能有自己的偏好,然则 许多项目都使用YAML作为配置文件,所以这个项目是很受欢迎的。

PyPI 页面

https://pypi.org/project/PyYAML/

文档

https://pyyaml.org/

11 Pyasn1

下载次数:5.12 亿

像上面的IDNA一样,这个项目也异常 有用:

ASN.1 类型和 DER/BER/CER 编码(X.208)的纯 Python 实现

所幸这个已有数十年历史的标准  有很多信息可用。ASN.1是 Abstract Syntax Notation One 的缩写,它就像是数据序列化的教父。它来自电信行业。也许你知道协议缓冲区或 Apache Thrift?这就是它们的 1984 年版本。

ASN.1 描述了系统之间的跨平台接口,以及可以通过该接口发送的数据结构。

还记得 Certifi(请参阅 #8)吗?ASN.1 用于界说  HTTPS 协议和其他许多加密系统中使用的证书格局 。它也用在了 SNMP、LDAP、Kerberos、UMTS、LTE 和 VOIP 协议中。

这是一个异常 庞杂 的规范,并且  某些实现已被证明满是漏洞。你可能还会喜欢关于 ASN.1 的这个有趣的 Reddit 帖子。

https://www.reddit.com/r/programming/comments/1hf7ds/useful_old_technologies_asn1/

一个建议,除非你真的需要,不然 还是敬而远之吧。但由于它用在很多处所 ,因此许多包都依赖这个包。

12 Docutils

下载次数:5.08 亿

Docutils是一个模块化系统,用来将纯文本文档处理  为很多有用的格局 ,例如 HTML、XML 和 LaTeX 等。Docutils能读取reStructuredText格局 的纯文本文档,这种格局 是类似于 MarkDown 的易读标记  语法。

你可能听说过,甚至读过 PEP 文档。

https://www.python.org/dev/peps/pep-0012/

那么什么是 PEP 文档?最早的 PEP 文档,PEP-1 为我们提供很好的解释:

PEP 的意思是 Python 增强提案。一个 PEP 就是一个设计文档,用来向 Python 社区提供信息,或描述 Python 或其进程 或环境的新功能  。PEP 应该提供该功能  的简明技术规范以及功能  的原理。

PEP 文档使用固定的reStructuredText模板编写,并使用docutils转换为格局 正确的文档。

Docutils 也是Sphinx的核心。Sphinx用于创建  文档项目。如果Docutils是一台机器,则Sphinx就是工厂  。它最初是为了构建 Python 文档而创建  的,但其他许多项目也使用它为代码提供文档。你可能已经读过 readthedocs.org 上的文档,那里的年夜 多半 文档都是由Sphinx和docutils创建  的。

13Chardet

下载次数:5.01 亿

你可以用chardet模块来检测文件或数据流的字符集。比如  说,需要剖析 年夜 量随机文本时,这会很有用。但你也可以在处理  远程下载的数据,但不知道用的是什么字符集时使用它。

安装chardet后,你还有一个名为chardetect的命令行对象 ,用法如下:
chardetect somefile.txtsomefile.txt: ascii with confidence 1.0

你还能通过编程方法 使用这个库,具体参阅文档。Chardet是requests等许多包的需求。我觉得没有若干 人会零丁 使用chardet,所以它这么流行肯定是因为这些依赖项。

https://chardet.readthedocs.io/en/latest/usage.html

14 RSA

下载次数:4.92 亿

rsa包是一个纯 Python 的 RSA 实现。它支持:
    加密和解密签名和验证签名依据  PKCS#1 1.5 版生成密钥

它既可以用作 Python 库,也能在命令行中使用。

一些事实:
    RSA 是 RonRivest、Adi Shamir 和 Leonard Adleman 三人姓的首字母。他们在 1977 年创造 该算法。RSA 是最早的公钥密码系统之一,被普遍 用于平安 数据传输。在这样的密码系统中,有两个密钥:公共部分  和私有部分  。你用公钥加密数据,只能用私钥解密数据。RSA 是一种 slow algorithm。它很少用于直接加密用户数据。通常,RSA 用于平安 传递对称密钥加密的共享密钥,这样加密和解密年夜 量数据时会快得多。

以下代码段展示了如何在一个异常 简单的用例中使用 RSA:
import rsa
# Bob creates a key pair:(bob_pub, bob_priv) = rsa.newkeys(512)
# Alice ecnrypts a message for Bob# with his public keycrypto = rsa.encrypt('hello Bob!', bob_pub)
# When Bob gets the message, he# decrypts it with his private key:message = rsa.decrypt(crypto, bob_priv)print(message.decode('utf8'))# hello Bob!

假设 Bob 保存 自己的私钥 private,那么 Alice 可以确定他是唯一可以阅读该消息的人。然则 ,Bob 不克不及 确定是 Alice 发送了该消息,因为任何人都可以获取并使用他的公钥。为证明是她,Alice 可以用她的私钥在邮件上签名。Bob 可以用她的公钥验证此签名,确保消息切实其实 是她发送的。

诸如google-auth(#37)、oauthlib(#54)、awscli(#17)之类的包都依赖rsa包。很少有人会将这个对象 自力 使用,因为有更快、更原生的替代办法 。

15 Jmespath

下载次数:4.73 亿

在 Python 中用 JSON 异常 容易,因为它在 Python 字典上的映射异常 好。对我来说,这是它最好的特性之一。




实话实说——尽管我已经用 JSON 做过很多工作,但我从未听说过这个包。我只是用 json.loads 并从字典中手动获取数据,也许再搞个循环什么的。

JMESPath,发音为“James path”,使 Python 中的 JSON 更容易使用。它允许你声明性地指定如何从 JSON 文档中提取元素。以下是一些基本示例:
import jmespath
# Get a specific elementd = {"foo": {"bar": "baz"}}print(jmespath.search('foo.bar', d))# baz
# Using a wildcard to get all namesd = {"foo": {"bar": [{"name": "one"}, {"name": "two"}]}}print(jmespath.search('foo.bar
  • .name', d))# [“one”, “two”]

    PyPI 页面

    https://pypi.org/project/jmespath/

    文档

    http://jmespath.org/

    16 Setuptools

    下载次数:4.01 亿

    它是用于创建   Python 包的对象 。不过  ,其文档很糟糕。它没有清晰描述它的用途,并且  文档中包含  无效链接。最好的信息源是这个站点,特别是这个创建   Python 包的指南。

    https://packaging.python.org/

    https://packaging.python.org/tutorials/packaging-projects/

    17 Awscli

    这里把 #3、#7、#17 和 #22 放在一起介绍,因为它们的关系异常 密切。

    18 Pytz

    下载次数:3.94 亿次

    像dateutils(#5)一样,这个库可赞助 你处理  日期和时间。有时候,时区处理  起来可能很麻烦。幸好有这样的包,可以让事情变得简单些。

    我自己关于计算机上处理  时间的经验总结来说是:始终在内部使用 UTC。仅当生成供人类读取的输出时,才转换为本地  时间。

    这是pytz用法的示例:
    from datetime import datetimefrom pytz import timezone
    amsterdam = timezone('Europe/Amsterdam')
    ams_time = amsterdam.localize(datetime(2002, 10, 27, 6, 0, 0))print(ams_time)# 2002-10-27 06:00:00+01:00
    # It will also know when it's Summer Time# in Amsterdam (similar to Daylight Savings Time):ams_time = amsterdam.localize(datetime(2002, 6, 27, 6, 0, 0))print(ams_time)# 2002-06-27 06:00:00+02:00

    19 Futures

    下载次数:3.89 亿

    从 Python 3.2 开始,python 提供current.futures模块,可赞助 你实现异步执行。futures 包是该库适用于 Python 2 的 backport。它不适用于 Python3 用户,因为 Python 3 原生提供了该模块。

    正如我之前提到的,从 2020 年 1 月 1 日起,Python 2 的官方支持停止。希望我明年重新再来看的时候,这个包不会再涌现 在前 22 名中吧。

    下面是 futures 的基本示例:
    from concurrent.futures import ThreadPoolExecutorfrom time import sleep
    def return_after_5_secs(message): sleep(5) return message
    pool = ThreadPoolExecutor(3)
    future = pool.submit(return_after_5_secs, ("Hello world"))
    print(future.done)# Falsesleep(5)print(future.done)# Trueprint(future.result)# Hello World

    如你所见,你可以创建  一个线程池并提交一个要由这些线程之一执行的函数。同时,你的法度模范   将继续在主线程中运行。这是并行执行法度模范   的简便办法 。

    20 Colorama

    下载次数:3.7 亿

    使用 Colorama,你可以为终端添加一些颜色:

    https://pypi.org/project/colorama/




    这样做起来异常 容易,具体请查看以下示例代码:
    from colorama import Fore, Back, Style
    print(Fore.RED + 'some red text')print(Back.GREEN + 'and with a green background')print(Style.DIM + 'and in dim text')print(Style.RESET_ALL)print('back to normal now')

    21 Simplejson

    下载次数:3.41 亿

    原生的json模块有什么问题,才需要这种高等 替代计划 呢?并没有!实际上,Python 的json就是simplejson。然则 simplejson也有一些优点:
      它适用于更多的 Python 版本。它比 Python 更新的频率更频繁。它有用 C 编写的(可选)部分  ,因此速度异常 快。

    你经常会在支持 JSON 的脚本中看到以下内容:
    try: import simplejson as jsonexcept ImportError: import json

    除非你需要标准  库中所没有的内容,不然 我只会使用json。Simplejson可以比json快很多,因为它有一些用 C 实现的部分  。除非你正在处理  成千上万个 JSON 文件,不然 这种优势对你来说不是什么年夜 事。还可以看看 UltraJSON,它应该更快一些,因为它几乎所有的代码都是用 C 编写的。

    22 Boto3

    这里把 #3、#7、#17 和 #22 放在一起介绍,因为它们的关系异常 密切。

    23 小结

    仅仅介绍这 22 个包恐怕不敷 ,因为排在后面的许多包都是像我们这样最终用户感兴趣的。

    通过制作这份列表,我了解到一些新器械 :
      许多排名靠前的 package(包)都提供某种核心功能  ,例如处理  时间、配置文件、加密和标准  化等。它们往往是其他项目的依赖项。一个常见的主题是连接性。这些包年夜 多允许你连接到办事 器和办事 ,或支持其他包这样做。剩下的那些是对 Python 的扩展。创建   Python 包的对象 、赞助 创建  文档的对象 、创建  版本之间兼容性的库等。

    延展阅读:

    https://medium.com/better-programming/the-22-most-used-python-packages-in-the-world-7020a904b2e
    回复下方「症结 词」,获取优质资源
    回复症结 词「 pybook03」,立即获取主页君与小伙伴一起翻译的《Think Python 2e》电子版
    回复症结 词「入门资料」,立即获取主页君整理的 10 本 Python 入门书的电子版
    回复症结 词「m」,立即获取Python精选优质文章合集
    回复症结 词「」,将数字替换成 0 及以上数字,有惊喜好礼哦~
    题图:pexels,CC0 授权。

    好文章,我在看❤️
  • 本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    回复

    使用道具 举报

    转发了
    回复

    使用道具 举报

    没手棋进负 | 2020-4-5 07:15:10 | 显示全部楼层
    转发了
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    13

    主题

    30

    回帖

    101

    积分

    注册会员

    Rank: 2

    积分
    101