当前位置: 首页 > 科技观察

学习Python,这22个常用库怎能不掌握?

时间:2023-03-17 12:08:34 科技观察

全球各行业Python使用现状如何?这个问题是我写这篇文章的初衷。我列出了22个最常用的Python包,希望能给你一些启发。首先我列出了去年PyPI上下载次数最多的Python包。让我们来看看这些包的作用、它们之间的关系以及它们为何如此受欢迎。1.Urllib38.93亿次下载Urllib3是Python的HTTP客户端,提供了很多Python标准库没有的功能。线程安全连接池客户端SSL/TLS身份验证文件上传使用多部分编码重传请求和处理HTTP重定向的可访问性支持gzip和deflate编码支持HTTP和SOCKS代理尽管名称Urllib3不是Python原生的urllib2的继承者和。如果你想尽可能的使用Python的核心功能(比如由于某些限制,你无法安装),那么你可以看看urllib.request。对于最终用户,我强烈推荐requests包(参考列表中的第6项)。Urllib3排名第一,因为几乎有1200个软件包依赖于它,而且其中许多软件包也在列表中名列前茅。2.Six7.32亿次下载Six是一个Python2和Python3兼容工具。该项目的目的是使代码能够在Python2和Python3上运行。它提供了许多函数来掩盖Python2和Python3之间的语法差异。最容易理解的示例是six.print_()。在Python3中,您需要使用print()函数进行输出,而在Python2中,您使用不带括号的print。所以使用six.print_()同时支持两种语言。重要提示:包名六来自2x3=6类似的库和未来如果你想将你的代码转换为Python3(不再支持Python2),你可以看看2to3虽然我知道包如此流行,我希望人们尽快放弃Python2,尤其是从2020年1月1日起,Python2不再被正式支持。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、EC2等。Botocore也是AWS-CLI(AWS的命令行界面)的基础。s3transfer(#7)是一个用于管理S3传输的Python库。该库仍在开发中,它的主页仍然被弃用,或者至少版本化,因为它的API甚至可能在次要版本号之间发生变化。boto3、AWS-CLI和许多其他项目都依赖于s3transfer。与AWS相关的库排名如此之高这一事实充分说明了AWS服务的受欢迎程度。4.Pip6.27亿次下载我猜很多人都知道并喜欢pip(Python的包安装程序)。使用pip从Python包索引和其他存储库(例如本地镜像或包含专有软件的自定义存储库)安装包是毫不费力的。关于pip的有趣事实:Pip的名称是一个递归定义:PipInstallsPackagesPip非常易于使用。要安装包,只需执行pipinstall。要删除,只需执行pipuninstall。Pip最大的好处就是可以安装一系列的包,一般放在一个requirements.txt文件中。该文件还可以指定每个包的详细版本号。大多数Python项目都将包含此文件。将pip与virtualenv(#57)相结合以创建可预测的、独立的环境,这些环境不会与系统自身的环境交互。5.python-dateutil6.17亿次下载Python-dateutil模块提供了对标准日期时间模块的强大扩展。普通Pythondatetime不能做的一切都可以用python-dateutil完成。您可以使用这个库做很多很酷的事情。我只是举一个非常有用的例子:从日志文件中模糊解析日期字符串:fromdateutil.parserimportparselogline='INFO2020-01-01T00:00:01Happynewyear,human.'timestamp=parse(log_line,fuzzy=True)print(timestamp)#2020-01-0100:00:016,requests6.11亿次下载Requests是基于下载次数最多的库urllib3。有了它,发送请求变得异常简单。许多人更喜欢requests而不是urllib3,因此requets可能比urllib3拥有更多的最终用户。后者更底层,通常作为其他项目的依赖项出现。以下示例演示了使用请求有多么简单:importrequestsr=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,...}7、s3transfer3号、7号、17号、22号相互关联,请参考3号的介绍。8.Certifi5.52亿次下载这几年几乎所有网站都启动了使用SSL。这可以从地址栏中的锁定图标看出。此图标表示该网站是安全的且已加密以避免窃听。加密基于受信任的公司或非营利组织(如LetsEncrypt)颁发的SSL证书。这些组织使用他们的证书对颁发的证书进行数字签名。使用这些证书的公共部分,浏览器可以验证网站的签名,从而证明您正在访问真实的网站,并且没有人在窃听数据。Python也可以做同样的功能,这需要使用certifi。它与Chrome、Firefox和Edge等Web浏览器中包含的根证书集合没有区别。Certifi是根证书的集合,以便Python代码可以验证SSL证书的真实性。很多项目都信任和依赖certifi,可以看这里。这就是该计划排名如此之高的原因。9.Idna5.27亿次下载根据PyPI页面,idna提供“对RFC5891中定义的IDNA协议(国际化域名应用程序)的支持”。让我们看看idna是什么意思:IDNA是处理包含非ASCII字符的域名的规则。但是原来的域名不是已经支持非ASCII字符了吗?所以有什么问题?问题是许多应用程序(例如电子邮件客户端和Web浏览器)不支持非ASCII字符。或者更具体地说,电子邮件和HTTP协议不支持这些字符。在很多国家这不是问题,但像中国、俄罗斯、德国、印度尼西亚等国家就很不方便了。因此,来自这些国家的一些聪明人聚在一起提出IDNA并非完全偶然。IDNA的核心是两个函数:ToASCII和ToUnicode。ToASCCI将国际化的Unicode域名转换为ASCII字符串,ToUnicode则相反。在IDNA包中,这两个函数分别叫做idna.encode()和idna.decode(),看下面的例子:'print(idna.decode('xn--eckwd4c7c.xn--zckzah'))#ドミイン.テスト这个编码的细节可以在RFC3490中找到。10.PyYAML5.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可以自动识别类型,所以只需要getint像这样:config[“section”][“my_int”]YAML还允许任意深度嵌套,这很方便,但不是每个项目都需要。使用哪个取决于您,但许多项目使用YAML作为其配置文件,11.pyasn15.12亿次下载和IDNA一样,这个项目的描述也非常翔实:一个纯Python实现的ASN.1类型和DER/BER/CER编码(X.208)。幸运的是,我们仍然可以找到很多关于这个已有几十年历史的标准的参考。ASN.1是AbstractSyntaxNotationOne(抽象语法符号一)的缩写,它是数据序列化的鼻祖。它来自通信行业。也许你知道协议buffer还是ApacheThrift?ASN.1正是它们的本来面目e于1984年。ASN.1描述了不同系统之间的跨平台接口,通过该接口可以发送数据结构。还记得8号的certifi吗?ASN.1用于定义HTTPS协议以及许多其他加密系统中使用的证书格式。ASN.1还广泛用于SNMP、LDAP、Kerberos、UMTS、LTE和VOIP等协议中。这是一个非常复杂的标准,并且已经发现一些实现充满了脆弱性。您可以在Reddit(https://www.reddit.com/r/programming/comments/1hf7ds/useful_old_technologies_asn1/)上查看关于ASN.1的讨论。除非真的有必要,否则我建议不要使用它。但是由于协议在很多地方使用,所以很多包都依赖它。12.Docutils5.08亿次下载Docutils是一个模块化系统,用于将纯文本文档转换为其他格式,如HTML、XML和LaTeX。docutils可以读取reStructuredText格式(一种类似于MarkDown的易于阅读的格式)的纯文本文档。我猜您听说过PEP文档,甚至可能阅读过它们。什么是PEP文件?PEP代表Python增强提案(PythonEnhancedProposal)。PEP是一种设计文档,用于向Python社区提供信息,或描述Python(或其处理器、环境)的新功能。PEP应提供功能的精确规范并给出功能的基本原理。PEP文档就是使用固定的reStructuredText模板,然后通过docutils转换成漂亮的文档。Sphinx核心也使用docutils。Sphinx用于创建文档项目。如果docutils是一台机器,那么Sphinx就是一家工厂。它最初旨在为Python本身构建文档,但许多其他项目也利用Sphinx来创建文档。您一定已经阅读了readthedocs.org上的文档,对吧?那里的文档都是使用Sphinx和docutils创建的。13.Chardet501万次下载你可以使用chardet模块来检查文件或数据流的字符集。此功能在分析大量随机文本时非常有用。但也可以用来判断远程下载的数据串。安装chardet后,可以使用命令行工具chardetect,如下:chardetectsomefile.txtsomefile.txt:asciiwithconfidence1.0你也可以在程序中使用这个库,看文档(https://chardet.readthedocs.io/en/latest/usage.html)。请求和许多其他包依赖于chardet。我不指望有多少人直接使用chardet,所以它的流行一定来自于这些依赖。14.RSA4.92亿次下载Rsa是RSA的纯Python实现。它支持以下功能:加密和解密签名和签名验证根据PKCS#1版本1.5生成密钥它可以作为Python库或在命令行上使用。RSA名称中的三个字母来自三个人的姓氏:RonRivest、AdiShamir和LeonardAdleman。他们于1977年发明了该算法。RSA是最早的公钥加密系统之一,广泛用于安全数据传输。该加密系统包括两个密钥:一个是公钥,另一个是私钥。数据使用公钥加密,然后只能使用私钥解密。RSA算法很慢。通常,RSA算法不直接用于加密用户数据,而是用于加密对称加密系统中使用的共享密钥,因为对称加密系统速度快,适合加密大量数据。以下代码演示了RSA的使用:importrsa#Bob创建一个密钥对:(bob_pub,bob_priv)=rsa.newkeys(512)#Alice使用他的公钥为Bob#加密一条消息crypto=rsa.encrypt('helloBob!',bob_pub)#当Bob收到消息时,他#用他的私钥解密:message=rsa.decrypt(crypto,bob_priv)print(message.decode('utf8'))#你好Bob!假设Bob有私钥Withthekeyprivate,Alice可以确定只有Bob可以读取消息。但是Bob不能确定Alice就是消息的发送者,因为任何人都可以获得Bob的公钥。为了证明发件人确实是爱丽丝,她可以用她的私钥对消息进行签名。Bob可以使用Alice的公钥验证签名,以确保发送者确实是Alice。许多其他包依赖于rsa,例如google-auth(#37)、oauthlib(#54)、awscli(#17)。这个包并不经常直接使用,因为有许多更快、更原生的方法。15.Jmespath4.73亿次下载在Python中使用JSON很容易,因为JSON可以完美地映射到Python字典。我认为这是最好的功能之一。老实说,我从来没有听说过jmepath包,尽管我经常使用JSON。我会使用json.loads()并手动从字典中读取数据,也许会编写一些循环。JMESPath,发音为“Jamespath”,使得在Python中使用JSON变得更加容易。您可以声明性地定义如何从JSON文档中读取数据。这里有一些基本的例子:importjmespath#Getaspecificelementd={"foo":{"bar":"baz"}}print(jmespath.search('foo.bar',d))#baz#使用通配符得到所有named={"foo":{"bar":[{"name":"one"},{"name":"two"}]}}print(jmespath.search('foo.bar[*].name',d))#["one","two"]这只是冰山一角。有关更多用法,请参阅其文档和PyPI主页。16.Setuptools4.01亿次下载Setuptools是一个用于创建Python包的工具。这个项目的文档很糟糕。该文档没有描述它的作用并且包含无效链接。这里有非常好的文档:https://packaging.python.org/,以及本文中关于如何创建Python包的教程:https://packaging.python.org/tutorials/packaging-projects/。17、awscli的第3、7、17、22处相互关联,请参考第3处的介绍。18.pytz3.94亿次下载类似于排名第5的dateutils,这个库可以帮助你操作日期和时间。处理时区很麻烦。幸运的是,这个包使时区处理变得容易。我的时间经验是:在内部永远使用UTC,只有在需要产生人类可读的输出时才转换为本地时间。这是pytz的示例:fromdatetimeimportdatetimefrompytzimporttimezoneamsterdam=timezone('Europe/Amsterdam')ams_time=amsterdam.localize(datetime(2002,10,27,6,0,0))print(ams_time)#2002-10-2706:00:00+01:00#它还会知道什么时候是阿姆斯特丹的夏令时#(类似于夏令时):ams_time=amsterdam.localize(datetime(2002,6,27,6,0,0))print(ams_time)#2002-06-2706:00:00+02:00更多文档和示例可以在PyPI页面上找到。19、Futures3.89亿次下载从Python3.2开始,python开始提供concurrent.futures模块,可以帮你进行异步操作。futures包是这个库的反向端口,因此它适用于Python2。当前版本的Python3不需要这个包,因为Python3本机提供了这个功能。正如我之前所说,从2020年1月1日起,Python2已正式停止。我希望明年当我再次列出这份清单时,我不会在前22名中看到这个包。下面是futures包的基本用法:fromconcurrent.futuresimportThreadPoolExecutorfromtimeimportsleepdefreturn_after_5_secs(message):sleep(5)returnmessagepool=ThreadPoolExecutor(3)future=pool.submit(return_after_5_secs,(")Helloworld(print")future.done())#Falsesleep(5)print(future.done())#Trueprint(future.result())#HelloWorld可见,我们可以创建一个线程池,然后提交一个函数让线程执行。同时,您的程序将继续在主线程上运行。这是实现并行执行的简单方法。20.Colorama3.7亿次下载您可以使用Colorama为终端添加颜色:以下示例演示了这有多么容易:fromcoloramaimportFore,Back,Styleprint(Fore.RED+'someredtext')print(Back.GREEN+'andwithagreenbackground')print(Style.DIM+'andindimtext')print(Style.RESET_ALL)print('现在恢复正常')21、Simplejson3.41亿次下载Python内置json有什么问题导致这个包排名如此之高的模块?没有问题!其实Python的json就是simplejson。但是simplejson有一些优势:它可以运行在更多的Python版本上,更新频率比Python高。部分代码是用C语言编写的,运行速度非常快。有时你会在脚本中看到这样写:SImplejson可能比json快很多,因为它的一部分是用C语言实现的。但是除非您处理数千个JSON文件,否则加速并不明显。也看看UltraJSON,一个几乎完全用C编写的包,应该更快。22、boto3的第3、7、17、22位相互关联,请参考第3位的介绍。结论只写22个包是有难度的,因为后面的很多包更容易被终端用户使用。写这篇文章给了我一些启发:很多排名靠前的包都提供了一些核心功能,比如处理时间、配置文件、加密和规范化等,它们通常是其他项目的依赖。最常见的使用场景是连接。许多包提供连接到服务器的功能,或支持其他包连接到服务器。其他包是对Python的扩展,比如创建Python包的工具、创建文档的工具、创建版本兼容性的工具等等。