作者 | Erik-Jan van Baaren
译者 | 弯月,责编 | 屠敏
头图 | CSDN 下载自东方 IC
出品 | CSDN(ID:CSDNnews)
以下为译文:
如今全世界各个行业内 Python 的运用情况怎么样呢?
这个问题便是我写这篇文案的初衷。我找出了22个最常用的 Python 包,希望能给你有些启发。
首要我列出了近期一年内 PyPI 上下载量最高的 Python 包。咱们来瞧瞧这些包的功效,它们的之间的关系,以及为何会如此流行。
1. Urllib3
8.93亿次下载
Urllib3 是 Python 的 HTTP 客户端,它供给了许多 Python 标准库无的功能。
线程安全
连接池
客户端 SSL/TLS 验证
运用 multipart 编码进行文件上传
用于重传请求并处理 HTTP 重定向的辅助功能
支持 gzip 和 deflate 编码
支持 HTTP 和 SOCKS 代理
尽管名字叫做 Urllib3,但它并不是 Python 自带的 urllib2 的后继版本。倘若你想尽可能运用 Python 的核心功能(例如因为某些限制引起不可安装),那样能够瞧瞧 urllib.request。
针对最后用户,我剧烈举荐 requests 包(参考列表中的第六项)。Urllib3 之因此排名第1是由于几乎 1200 个软件包都依赖它,许多这些软件包亦都在列表中名列前茅。
2. Six
7.32亿次下载
Six 是 Python 2 和 Python 3 兼容性工具。该项目的目的是让代码能够同期在 Python 2 和 Python 3 上运行。
它供给了许多函数,掩盖了 Python 2 和 Python 3 之间的语法差异。最容易理解的例子便是six.print_。在 Python 3 中,输出时必须运用 print 函数,而 Python 2 中是运用不带括号的 print。因此呢,运用 six.print_ 能够同期支持两种语言。
重点:
包的名字 six 来自于2 x 3 = 6
类似的库还有 future
倘若想将代码转换成 Python 3(同期再也不支持 Python 2),能够看看 2to3
尽管我理解该包如此流行,但还是期盼人们尽快抛弃 Python 2,尤其是从2020年1月1日起官方已然再也不支持 Python 2了。
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名)库的基本,后者能够让你拜访亚马逊的S3、EC2等服务。
Botocore 亦是 AWS-CLI 的基本,后者是 AWS 的命令行界面。
s3transfer(第七名)是用于管理S3传输的 Python 库。该库仍在研发中,它的主页依然不意见运用,或运用时最少要固定版本,由于即使在小版本号之间它的API亦可能会出现变化。boto3、AWS-CLI 和许多其他项目都依赖于 s3transfer。
AWS 关联的库的排名如此高,正说明了 AWS 的服务是多么流行。
4. Pip
6.27亿次下载
我猜许多人都晓得并且喜欢 pip(Python的包安装工具)。运用 pip 从 Python Package Index和其他仓库(如本地镜像或包括私有软件的自定义仓库等)安装软件包不费吹灰之力。
关于 pip 的趣事:
Pip 的名字是个递归定义:Pip Installs Packages
Pip 非常容易运用。安装一个软件包只必须执行 pip install <软件包名>。删除只必须执行 pip uninstall <软件包名>。
Pip 最大的好处便是它能够安装一系列包,一般会放在 requirements.txt 文件中。该文件还能够指定每一个包的仔细版本号。绝大都数 Python 项目都会包括这个文件。
与 virtualenv(第57名)结合运用 pip,能够创建可预测的、独立的环境,而不会与系统本身的环境互相影响。
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。有了它,发送请求变得极其简单。许多人对 requests 的喜欢超过了 urllib3,因此呢 requets 的最后用户可能比 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 # {udisk_usage: 368627, uprivate_gists: 484, ...}7. s3transfer
第3、7、17和22名互关联联,因此请参见第3名的介绍。
8. Certifi
5.52亿次下载
近年来,几乎所有网站都起始运用SSL,这一点能够从位置栏中的锁图标看出来,该图标的意思是网站是安全的、加密的,能够避免窃听。
加密基于SSL证书,SSL证书由可信的机构或非营利组织负责签发,如 LetsEncrypt。这些组织会对利用它们的证书对签发的证书进行数字签名。
利用这些证书的公开部分,浏览器就能够验证网站的签名,从而证明你拜访的是真正的网站,况且别人无在窃听数据。
Python 亦能够做到一样的功能,这就必须用到 certifi。它和 Chrome、Firefox 和 Edge 等Web浏览器中包括的根证书集合无什么区别。
Certifi 是一个根证书集合,这般 Python 代码就能够验证SSL证书的可信度。
许多项目都信赖并依赖 certifi,能够在这儿看到这些项目。这亦是为么该项目排名如此高的原由。
9. Idna
5.27亿次下载
按照 PyPI 的页面,idna供给“针对RFC5891中定义的IDNA协议(Internationalised Domain Names in Applications)的支持”。
咱们来瞧瞧 idna 是什么意思:
IDNA 是处理包括非 ASCII 字符的域名的规则。但原始的域名不是已然支持非 ASCII 字符了吗?那样问题安在?
问题是许多应用程序(如Email客户端和Web浏览器等)并不支持非 ASCII 字符。或更详细地说,Email 和 HTTP 协议并不支持这些字符。
在许多国家这并不是问题,但像中国、俄罗斯、德国、印尼等国家就很不方便。因此呢,这些国家的有些聪明人联合起来提出了 IDNA,亦并非完全偶然。
IDNA 的核心是两个函数:ToASCII 和 ToUnicode。ToASCCI 会将国际化的 Unicode 域名转换成 ASCII 字符串,而 ToUnicode 会做相反的处理。在 IDNA 包中,这两个函数叫做 idna.encode 和 idna.decode,参见下面的例子: import
idna idna.encode(ドメイン.テスト
) # bxn--eckwd4c7c.xn--zckzahprint(idna.decode(xn--eckwd4c7c.xn--zckzah
)) # ドメイン.テスト该编码的仔细内容能够参见 RFC3490。
10. PyYAML
5.25亿次下载
YAML 是一种数据序列化格式。它的设计目的是同期方便人类和设备阅读——人类很容易读懂,计算机解析亦不难。
PyYAML 是 Python 的 YAM 解析器和编码器,亦便是说它能够读写 YAML 格式。它能够将任何 Python 对象编码为 YAML:列表,字典,乃至类实例都能够。
Python 供给了自己的配置管理器,但 YAML 供给的功能远强过 Python 自带的 ConfigParser(只能运用最基本的.ini文件)。
例如,YAML 能存储任何数据类型:boolean,list,float等。ConfigParse 的内部一切都保留为字符串。倘若你要用 ConfigParser 来加载证书,就必须指明你必须的是整数: config.getint(“section”, “my_int
”)
而 pyyaml 能够自动识别类型,因此呢只需这般就能得到 int: config[“section”][“my_int”
]
YAML 还准许任意深度的嵌套,尽管并非每一个项目都必须,但非常方便。
你能够自动决定运用哪一个,但许多项目都运用 YAML 做为配置文件,因此呢该项目的流行度非常高。
11. pyasn1
5.12亿次下载
像 IDNA 同样,这个项目的描述的信息量亦非常大:
ASN.1 类型和 DER/BER/CER 编码(X.208)的纯 Python 实现。
幸运的是,咱们依然能找到这个几十年之久的标准的许多资料。ASN.1 是 Abstract Syntax Notation One(抽象语法记法一)的缩写,是数据序列化的鼻祖。它来自于通讯行业。亦许你晓得 protocol buffer 或 Apache Thrift 吧?ASN.1正是它们的1984年版本。
ASN.1 描述了一种区别系统之间的跨平台的接口,能够经过该接口发送数据结构。
还记得第8名的 certifi 吗?ASN.1 用于定义 HTTPS 协议以及许多其他加密系统中运用的证书的格式。ASN.1 还广泛用于 SNMP、LDAP、Kerberos、UMTS、LTE 和 VOIP 等协议中。
它是个非常繁杂的标准,人们已然发掘某些实现充满了脆弱性。你能够瞧瞧 Reddit 上的这个关于 ASN.1 的讨论( https://www.reddit.com/r/programming/comments/1hf7ds/useful_old_technologies_asn1/)。
除非真正必要,否则我意见不要运用它。但因为许多地区都在运用该协议,因此呢许多包都依赖于它。
12. docutils
5.08亿次下载
Docutils 是一个模块化系统,用于将纯文本文档转换成其他格式,如 HTML、XML 和 LaTeX等。docutils 能够读取 reStructuredText 格式(一种类似于 MarkDown 的容易阅读的格式)的纯文本文档。
我猜你必定听说过 PEP 文档,乃至可能阅读过。PEP 文档是什么?
PEP 的意思是 Python Enhanced Proposal(Python加强提案)。PEP 是一篇设计文档,用于给 Pytho n社区供给信息,或为 Python(或其处理器、环境)描述一个新特性。PEP 应该供给特性的精确的技术标准,并给出该特性的理由。
PEP 文档便是运用固定的 reStructuredText 模板,而后经过 docutils 转换成美丽的文档。
Sphinx 的核心亦运用了 docutils。Sphinx 用于创建文档项目。倘若说 docutils 是一台设备,那样 Sphinx 便是一个工厂。它的最初设计目的是构建P ython 本身的文档,但许多其他项目亦利用 Sphinx 来创建文档。
你必定度过 readthedocs.org 上的文档吧?那里的文档都是运用 Sphinx 和 docutils 创建的。
13. Chardet
5.01亿下载
你能够运用 chardet 模块来检测文件或数据流的字符集。在分析海量随机的文本时这个功能非常有用。但亦能够用来判断远程下载的数据的字符串。
在安装 chardet 后,就能够运用命令行工具 chardetect,运用办法如下: chardetect somefile.txtsomefile.txt: ascii with confidence 1.0
亦能够在程序中运用该库,参见文档( https://chardet.readthedocs.io/en/latest/usage.html)。
Requests 和许多其他包都依赖于 chardet。我估计不会有太多人直接运用 chardet,因此它的流行度肯定是来自于这些依赖。
14. RSA
4.92亿次下载
Rsa是 RSA 的纯 Python 实现。它支持如下功能:
加密和解密
签名和签名验证
按照 PKCS#1 version 1.5生成秘钥
它能够做为 Python 库运用,亦能够在命令行上运用。
RSA 名叫作中的三个字母来自于三个人的姓:Ron Rivest,Adi Shamir,和Leonard Adleman。她们于1977年发明了该算法。
RSA 是最早显现的一批公钥加密系统,广泛用于安全数据传输。这种加密系统包括两个秘钥:一个是公钥,一个是私钥。运用公钥加密数据,而后该数据只能用私钥进行解密。
RSA 算法很慢。一般并不运用 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
key crypto = 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 才可阅读该信息。
但 Bob 并不可确信 Alice 是信息的发送者,由于任何人都能够得到 Bob 的公钥。为了证明发送者的确是 Alice,她能够运用自己的私钥对信息进行签名。Bob 能够运用 Alice 的公钥对签名进行验证,来保证发送者的确是 Alice。
许多其他包都依赖于 rsa,如 google-auth(第37名),oauthlib(第54名),awscli(第17名)。这个包并不会经常被直接运用,由于有许多更快、更原生的办法。
15. Jmespath
4.73亿次下载
在 Python 中运用 JSON 很容易,由于 JSON 能够完美地映射到 Python 的字典上。我认为这是最好的特性之一。
说实话我从来没听说过 jmepath 这个包,尽管我运用过非常多 JSON。我会运用 json.loads 而后手动从字典中读取数据,或许还得写几个循环。
JMESPath,读作“James path”,能更易地在 Python 中运用 JSON。你能够用声明的方式定义怎么样从 JSON 文档中读取数据。下面是有些最基本的例子: import
jmespath
# Get a specific element d = {"foo": {"bar": "baz"
}} print(jmespath.search(foo.bar
, d))
# baz
# Using a wildcard to get all names d = {"foo": {"bar": [{"name": "one"}, {"name": "two"
}]}} print(jmespath.search(foo.bar[*].name
, d)) # [“one”, “two”]这仅仅是它的冰山一角。更加多用法参见它的文档和 PyPI 主页。
16. Setuptools
4.01亿次下载
Setuptools 是用来创建 Python 包的工具。
这个项目的文档很糟糕。文档并无描述它的功能,还包括死链接。真正的好文档在这儿:
https://packaging.python.org/,以及这篇文案中关于怎么样创建 Python 包的教程: https://packaging.python.org/tutorials/packaging-projects/。
17. awscli
第3、7、17和22名互关联联,因此请参见第3名的介绍。
18. pytz
3.94亿次下载
类似于第5名的 dateutils,该库能够帮忙你操作日期和时间。处理时区很麻烦。幸运的是,这个包能够让时区处理变得很容易。
关于时间,我的经验是:在内部永远运用UTC,仅有在必须产生供人阅读的输出时才转换成本地时间。
下面是 pytz 的例子: from datetime import datetimefrom pytz import timezoneamsterdam = 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 its 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
更加多文档和例子能够参见 PyPI 页面。
19. Futures
3.89亿次下载
从 Python 3.2 起始,python 起始供给 concurrent.futures 模块,能够帮你执行异步操作。futures 包是该库的反向移植,因此它是用于 Python 2 的。当前的 Python 3 版本不必须该包,由于 Python 3 本身就供给了该功能。
前面我说过,从2020年1月1日起官方已然停止支持 Python 2。我期盼明年再做这个列表的时候,再也不看到这个包排进前22名。
下面是 futures 包的基本用法: from concurrent.futures import
ThreadPoolExecutor from 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.70亿次下载
你能够运用 Colorama 在终端上添加颜色:
下面的示例演示了实现这个功能有多么容易: from colorama import
Fore, Back, Style print(Fore.RED + some red text
) print(Back.GREEN + and with a green bac公斤round
) print(Style.DIM + and in dim text
) print
(Style.RESET_ALL) print(back to normal now)21. Simplejson
3.41亿次下载
Python 自带的 json 模块有什么问题引起了这个包有如此高的排名?无任何问题!实质上, Python 的 json 便是 simplejson。但 simplejson 有有些优点:
能在更加多 Python 版本上运行
更新频率高于 Python
一部分代码是用C编写的,运行得非常快
有时候你会看到脚本中这般写: try
: import simplejson as
json
except ImportError: import json不外,除非确实必须有些标准库中无的功能,我依然会运用 json。SImplejson 可能比 json快非常多,由于它的一部分是用C实现的。然则除非你要处理几千个 JSON 文件,否则这点速度提高并不显著。另外还能够瞧瞧 UltraJSON,这是个几乎完全用C编写的包,应该速度更快。
22. boto3
第3、7、17和22名互关联联,因此请参见第3名的介绍。
结束语
只写22个包很难,由于后面的许多包都是终端用户更倾向运用的包。
写这篇文案给了我有些启示:
许多排名靠前的包供给有些核心的功能,如处理时间、配置文件、加密和标准化等。它们一般是其他项目的依赖。
最平常的运用场景便是连接。许多包供给的功能便是连接到服务器,或支持其他包连接服务器。
其他包是对 Python 的扩展,例如用于创建 Python 包的工具,创建文档的工具,创建版本兼容性的工具,等等。
我期盼你爱好这个列表,并能够从中有所收获!
原文: https://medium.com/better-programming/the-22-most-used-python-packages-in-the-world-7020a904b2e
本文为 CSDN 翻译,转载请注明源自出处。
|