本篇內(nèi)容介紹了“學(xué)習(xí)Python常用的庫(kù)有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)自2013年創(chuàng)立以來(lái),先為依安等服務(wù)建站,依安等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為依安企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
Urllib3 是 Python 的 HTTP 客戶(hù)端,它提供了許多 Python 標(biāo)準(zhǔn)庫(kù)沒(méi)有的功能。
線程安全
連接池
客戶(hù)端 SSL/TLS 驗(yàn)證
使用 multipart 編碼進(jìn)行文件上傳
用于重傳請(qǐng)求并處理 HTTP 重定向的輔助功能
支持 gzip 和 deflate 編碼
支持 HTTP 和 SOCKS 代理
盡管名字叫做 Urllib3,但它并不是 Python 自帶的 urllib2 的后繼版本。如果你想盡可能使用 Python 的核心功能(比如由于某些限制導(dǎo)致不能安裝),那么可以看看 urllib.request。
對(duì)于最終用戶(hù),我強(qiáng)烈推薦 requests 包(參考列表中的第六項(xiàng))。Urllib3 之所以排名第一是因?yàn)閹缀?1200 個(gè)軟件包都依賴(lài)它,許多這些軟件包也都在列表中名列前茅。
Six 是 Python 2 和 Python 3 兼容性工具。該項(xiàng)目的目的是讓代碼能夠同時(shí)在 Python 2 和 Python 3 上運(yùn)行。
它提供了許多函數(shù),掩蓋了 Python 2 和 Python 3 之間的語(yǔ)法差異。最容易理解的例子就是six.print_()。在 Python 3 中,輸出時(shí)需要使用 print() 函數(shù),而 Python 2 中是使用不帶括號(hào)的 print。因此,使用 six.print_() 可以同時(shí)支持兩種語(yǔ)言。
重點(diǎn):
包的名字 six 來(lái)自于2 x 3 = 6
類(lèi)似的庫(kù)還有 future
如果想將代碼轉(zhuǎn)換成 Python 3(同時(shí)不再支持 Python 2),可以看看 2to3
盡管我理解該包如此流行,但還是希望人們盡快拋棄 Python 2,特別是從2020年1月1日起官方已經(jīng)不再支持 Python 2了。
這幾個(gè)項(xiàng)目放在一起說(shuō):
botocore:第3名,6.6億次下載
s3transfer:第7名,5.84億次下載
awscli:第17名,3.94億次下載
boto3:第22名,3.29億次下載
Botocore 是 AWS 的底層接口。botocore 是 boto3(第22名)庫(kù)的基礎(chǔ),后者可以讓你訪問(wèn)亞馬遜的S3、EC2等服務(wù)。
Botocore 也是 AWS-CLI 的基礎(chǔ),后者是 AWS 的命令行界面。
s3transfer(第七名)是用于管理S3傳輸?shù)?Python 庫(kù)。該庫(kù)仍在開(kāi)發(fā)中,它的主頁(yè)依然不建議使用,或者使用時(shí)至少要固定版本,因?yàn)榧词乖谛“姹咎?hào)之間它的API也可能會(huì)發(fā)生變化。boto3、AWS-CLI 和許多其他項(xiàng)目都依賴(lài)于 s3transfer。
AWS 相關(guān)的庫(kù)的排名如此高,正說(shuō)明了 AWS 的服務(wù)是多么流行。
我猜許多人都知道并且喜愛(ài) pip(Python的包安裝工具)。使用 pip 從 Python Package Index和其他倉(cāng)庫(kù)(如本地鏡像或包含私有軟件的自定義倉(cāng)庫(kù)等)安裝軟件包不費(fèi)吹灰之力。
關(guān)于 pip 的趣事:
Pip 的名字是個(gè)遞歸定義:Pip Installs Packages
Pip 非常容易使用。安裝一個(gè)軟件包只需要執(zhí)行 pip install
<軟件包名>。刪除只需要執(zhí)行 pip uninstall <軟件包名>。
Pip 最大的好處就是它可以安裝一系列包,通常會(huì)放在 requirements.txt 文件中。該文件還可以指定每個(gè)包的詳細(xì)版本號(hào)。絕大多數(shù) Python 項(xiàng)目都會(huì)包含這個(gè)文件。
與 virtualenv(第57名)結(jié)合使用 pip,可以創(chuàng)建可預(yù)測(cè)的、獨(dú)立的環(huán)境,而不會(huì)與系統(tǒng)本身的環(huán)境互相影響。
Pthon-dateutil 模塊為標(biāo)準(zhǔn)的 datetime 模塊提供了強(qiáng)大的功能擴(kuò)展。普通的 Python datetime 無(wú)法做到的事情都可以使用 python-dateutil 完成。
用這個(gè)庫(kù)可以完成許多非??岬墓δ?。我只舉一個(gè)非常有用的例子:從日志文件中模糊解析日期字符串:
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
Requests 基于下載量第一的庫(kù) urllib3。有了它,發(fā)送請(qǐng)求變得極其簡(jiǎn)單。許多人對(duì) requests 的喜愛(ài)超過(guò)了 urllib3,因此 requets 的最終用戶(hù)可能比 urllib3 還要多。后者更底層,通常作為其他項(xiàng)目的依賴(lài)出現(xiàn)。
下面的例子演示了 requests 有多么容易使用:
import requests r = requests.get('https://api.github.com/user', auth=('user', 'pass')) r.status_code # 200 r.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, ...}
第3、7、17和22名互相關(guān)聯(lián),所以請(qǐng)參見(jiàn)第3名的介紹。
近年來(lái),幾乎所有網(wǎng)站都開(kāi)始使用SSL,這一點(diǎn)可以從地址欄中的鎖圖標(biāo)看出來(lái),該圖標(biāo)的意思是網(wǎng)站是安全的、加密的,可以避免竊聽(tīng)。
加密基于SSL證書(shū),SSL證書(shū)由可信的公司或非營(yíng)利組織負(fù)責(zé)簽發(fā),如 LetsEncrypt。這些組織會(huì)對(duì)利用它們的證書(shū)對(duì)簽發(fā)的證書(shū)進(jìn)行數(shù)字簽名。
利用這些證書(shū)的公開(kāi)部分,瀏覽器就可以驗(yàn)證網(wǎng)站的簽名,從而證明你訪問(wèn)的是真正的網(wǎng)站,而且別人沒(méi)有在竊聽(tīng)數(shù)據(jù)。
Python 也可以做到同樣的功能,這就需要用到 certifi。它和 Chrome、Firefox 和 Edge 等Web瀏覽器中包含的根證書(shū)集合沒(méi)有什么區(qū)別。
Certifi 是一個(gè)根證書(shū)集合,這樣 Python 代碼就可以驗(yàn)證SSL證書(shū)的可信度。
許多項(xiàng)目都信賴(lài)并依賴(lài) certifi,可以在這里看到這些項(xiàng)目。這也是為何該項(xiàng)目排名如此高的原因。
根據(jù) PyPI 的頁(yè)面,idna提供“對(duì)于RFC5891中定義的IDNA協(xié)議(Internationalised Domain Names in Applications)的支持”。
我們來(lái)看看 idna 是什么意思:
IDNA 是處理包含非 ASCII 字符的域名的規(guī)則。但原始的域名不是已經(jīng)支持非 ASCII 字符了嗎?那么問(wèn)題何在?
問(wèn)題是許多應(yīng)用程序(如Email客戶(hù)端和Web瀏覽器等)并不支持非 ASCII 字符?;蛘吒唧w地說(shuō),Email 和 HTTP 協(xié)議并不支持這些字符。
在許多國(guó)家這并不是問(wèn)題,但像中國(guó)、俄羅斯、德國(guó)、印尼等國(guó)家就很不方便。因此,這些國(guó)家的一些聰明人聯(lián)合起來(lái)提出了 IDNA,也并非完全偶然。
IDNA 的核心是兩個(gè)函數(shù):ToASCII 和 ToUnicode。ToASCCI 會(huì)將國(guó)際化的 Unicode 域名轉(zhuǎn)換成 ASCII 字符串,而 ToUnicode 會(huì)做相反的處理。在 IDNA 包中,這兩個(gè)函數(shù)叫做 idna.encode() 和 idna.decode(),參見(jiàn)下面的例子:
import idna idna.encode('ドメイン.テスト') # b'xn--eckwd4c7c.xn--zckzah' print(idna.decode('xn--eckwd4c7c.xn--zckzah')) # ドメイン.テスト
該編碼的詳細(xì)內(nèi)容可以參見(jiàn) RFC3490。
YAML 是一種數(shù)據(jù)序列化格式。它的設(shè)計(jì)目標(biāo)是同時(shí)方便人類(lèi)和機(jī)器閱讀——人類(lèi)很容易讀懂,計(jì)算機(jī)解析也不難。
PyYAML 是 Python 的 YAM 解析器和編碼器,也就是說(shuō)它可以讀寫(xiě) YAML 格式。它可以將任何 Python 對(duì)象編碼為 YAML:列表,字典,甚至類(lèi)實(shí)例都可以。
Python 提供了自己的配置管理器,但 YAML 提供的功能遠(yuǎn)勝于 Python 自帶的 ConfigParser(只能使用最基本的.ini文件)。
例如,YAML 能存儲(chǔ)任何數(shù)據(jù)類(lèi)型:boolean,list,float等。ConfigParse 的內(nèi)部一切都保存為字符串。如果你要用 ConfigParser 來(lái)加載證書(shū),就需要指明你需要的是整數(shù):
config.getint(“section”, “my_int”)
而 pyyaml 能夠自動(dòng)識(shí)別類(lèi)型,因此只需這樣就能獲得 int:
config[“section”][“my_int”]
YAML 還允許任意深度的嵌套,盡管并非每個(gè)項(xiàng)目都需要,但非常方便。
你可以自行決定使用哪一個(gè),但許多項(xiàng)目都使用 YAML 作為配置文件,因此該項(xiàng)目的流行度非常高。
像 IDNA 一樣,這個(gè)項(xiàng)目的描述的信息量也非常大:
ASN.1 類(lèi)型和 DER/BER/CER 編碼(X.208)的純 Python 實(shí)現(xiàn)。
幸運(yùn)的是,我們依然能找到這個(gè)幾十年之久的標(biāo)準(zhǔn)的許多資料。ASN.1 是 Abstract Syntax Notation One(抽象語(yǔ)法記法一)的縮寫(xiě),是數(shù)據(jù)序列化的鼻祖。它來(lái)自于通訊行業(yè)。也許你知道 protocol buffer 或者 Apache Thrift 吧?ASN.1正是它們的1984年版本。
ASN.1 描述了一種不同系統(tǒng)之間的跨平臺(tái)的接口,可以通過(guò)該接口發(fā)送數(shù)據(jù)結(jié)構(gòu)。
還記得第8名的 certifi 嗎?ASN.1 用于定義 HTTPS 協(xié)議以及許多其他加密系統(tǒng)中使用的證書(shū)的格式。ASN.1 還廣泛用于 SNMP、LDAP、Kerberos、UMTS、LTE 和 VOIP 等協(xié)議中。
它是個(gè)非常復(fù)雜的標(biāo)準(zhǔn),人們已經(jīng)發(fā)現(xiàn)某些實(shí)現(xiàn)充滿(mǎn)了脆弱性。
除非真正必要,否則我建議不要使用它。但由于許多地方都在使用該協(xié)議,因此許多包都依賴(lài)于它。
Docutils 是一個(gè)模塊化系統(tǒng),用于將純文本文檔轉(zhuǎn)換成其他格式,如 HTML、XML 和 LaTeX等。docutils 可以讀取 reStructuredText 格式(一種類(lèi)似于 MarkDown 的容易閱讀的格式)的純文本文檔。
我猜你一定聽(tīng)說(shuō)過(guò) PEP 文檔,甚至可能閱讀過(guò)。PEP 文檔是什么?
PEP 的意思是 Python Enhanced Proposal(Python增強(qiáng)提案)。PEP 是一篇設(shè)計(jì)文檔,用于給 Pytho n社區(qū)提供信息,或者為 Python(或其處理器、環(huán)境)描述一個(gè)新特性。PEP 應(yīng)該提供特性的精確的技術(shù)標(biāo)準(zhǔn),并給出該特性的理由。
PEP 文檔就是使用固定的 reStructuredText 模板,然后通過(guò) docutils 轉(zhuǎn)換成漂亮的文檔。
Sphinx 的核心也使用了 docutils。Sphinx 用于創(chuàng)建文檔項(xiàng)目。如果說(shuō) docutils 是一臺(tái)機(jī)器,那么 Sphinx 就是一個(gè)工廠。它的最初設(shè)計(jì)目的是構(gòu)建P ython 本身的文檔,但許多其他項(xiàng)目也利用 Sphinx 來(lái)創(chuàng)建文檔。
你一定度過(guò) readthedocs.org 上的文檔吧?那里的文檔都是使用 Sphinx 和 docutils 創(chuàng)建的。
你可以使用 chardet 模塊來(lái)檢查文件或數(shù)據(jù)流的字符集。在分析大量隨機(jī)的文本時(shí)這個(gè)功能非常有用。但也可以用來(lái)判斷遠(yuǎn)程下載的數(shù)據(jù)的字符串。
在安裝 chardet 后,就可以使用命令行工具 chardetect,使用方法如下:
chardetect somefile.txt somefile.txt: ascii with confidence 1.0
也可以在程序中使用該庫(kù),參見(jiàn)文檔(https://chardet.readthedocs.io/en/latest/usage.html)。
Requests 和許多其他包都依賴(lài)于 chardet。我估計(jì)不會(huì)有太多人直接使用 chardet,所以它的流行度肯定是來(lái)自于這些依賴(lài)。
Rsa是 RSA 的純 Python 實(shí)現(xiàn)。它支持如下功能:
加密和解密
簽名和簽名驗(yàn)證
根據(jù) PKCS#1 version 1.5生成秘鑰
它可以作為 Python 庫(kù)使用,也可以在命令行上使用。
RSA 名稱(chēng)中的三個(gè)字母來(lái)自于三個(gè)人的姓:Ron Rivest,Adi Shamir,和Leonard Adleman。他們于1977年發(fā)明了該算法。
RSA 是最早出現(xiàn)的一批公鑰加密系統(tǒng),廣泛用于安全數(shù)據(jù)傳輸。這種加密系統(tǒng)包括兩個(gè)秘鑰:一個(gè)是公鑰,一個(gè)是私鑰。使用公鑰加密數(shù)據(jù),然后該數(shù)據(jù)只能用私鑰進(jìn)行解密。
RSA 算法很慢。通常并不使用 RSA 算法直接加密用戶(hù)數(shù)據(jù),而是用它來(lái)加密對(duì)稱(chēng)加密系統(tǒng)中使用的共享秘鑰,因?yàn)閷?duì)稱(chēng)加密系統(tǒng)速度很快,適合用來(lái)加密大量數(shù)據(jù)。
下面代碼演示了 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!
假設(shè) Bob 擁有私鑰 private,Alice 就能確信只有 Bob 才能閱讀該信息。
但 Bob 并不能確信 Alice 是信息的發(fā)送者,因?yàn)槿魏稳硕伎梢垣@得 Bob 的公鑰。為了證明發(fā)送者的確是 Alice,她可以使用自己的私鑰對(duì)信息進(jìn)行簽名。Bob 可以使用 Alice 的公鑰對(duì)簽名進(jìn)行驗(yàn)證,來(lái)確保發(fā)送者的確是 Alice。
許多其他包都依賴(lài)于 rsa,如 google-auth(第37名),oauthlib(第54名),awscli(第17名)。這個(gè)包并不會(huì)經(jīng)常被直接使用,因?yàn)橛性S多更快、更原生的方法。
在 Python 中使用 JSON 很容易,因?yàn)?JSON 可以完美地映射到 Python 的字典上。我認(rèn)為這是最好的特性之一。
說(shuō)實(shí)話我從來(lái)沒(méi)聽(tīng)說(shuō)過(guò) jmepath 這個(gè)包,盡管我使用過(guò)很多 JSON。我會(huì)使用 json.loads() 然后手動(dòng)從字典中讀取數(shù)據(jù),或許還得寫(xiě)幾個(gè)循環(huán)。
JMESPath,讀作“James path”,能更容易地在 Python 中使用 JSON。你可以用聲明的方式定義怎樣從 JSON 文檔中讀取數(shù)據(jù)。
下面是一些最基本的例子:
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”]
這僅僅是它的冰山一角。更多用法參見(jiàn)它的文檔和 PyPI 主頁(yè)。
Setuptools 是用來(lái)創(chuàng)建 Python 包的工具。
這個(gè)項(xiàng)目的文檔很糟糕。文檔并沒(méi)有描述它的功能,還包含死鏈接。
第3、7、17和22名互相關(guān)聯(lián),所以請(qǐng)參見(jiàn)第3名的介紹。
類(lèi)似于第5名的 dateutils,該庫(kù)可以幫助你操作日期和時(shí)間。處理時(shí)區(qū)很麻煩。幸運(yùn)的是,這個(gè)包可以讓時(shí)區(qū)處理變得很容易。
關(guān)于時(shí)間,我的經(jīng)驗(yàn)是:在內(nèi)部永遠(yuǎn)使用UTC,只有在需要產(chǎn)生供人閱讀的輸出時(shí)才轉(zhuǎn)換成本地時(shí)間。
下面是 pytz 的例子:
from datetime import datetime from 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
更多文檔和例子可以參見(jiàn) PyPI 頁(yè)面。
從 Python 3.2 開(kāi)始,python 開(kāi)始提供 concurrent.futures 模塊,可以幫你執(zhí)行異步操作。futures 包是該庫(kù)的反向移植,所以它是用于 Python 2 的。當(dāng)前的 Python 3 版本不需要該包,因?yàn)?Python 3 本身就提供了該功能。
前面我說(shuō)過(guò),從2020年1月1日起官方已經(jīng)停止支持 Python 2。我希望明年再做這個(gè)列表的時(shí)候,不再看到這個(gè)包排進(jìn)前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()) # False sleep(5) print(future.done()) # True print(future.result()) # Hello World
可見(jiàn),我們可以創(chuàng)建一個(gè)線程池,然后提交一個(gè)函數(shù),讓某個(gè)線程執(zhí)行。同時(shí),你的程序會(huì)繼續(xù)在主線程上運(yùn)行。這是實(shí)現(xiàn)并行執(zhí)行的一種很容易的方式。
你可以使用 Colorama 在終端上添加顏色:
下面的示例演示了實(shí)現(xiàn)這個(gè)功能有多么容易:
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')
Python 自帶的 json 模塊有什么問(wèn)題導(dǎo)致了這個(gè)包有如此高的排名?沒(méi)有任何問(wèn)題!實(shí)際上, Python 的 json 就是 simplejson。但 simplejson 有一些優(yōu)點(diǎn):
能在更多 Python 版本上運(yùn)行
更新頻率高于 Python
一部分代碼是用C編寫(xiě)的,運(yùn)行得非常快
有時(shí)候你會(huì)看到腳本中這樣寫(xiě):
try: import simplejson as json except ImportError: import json
不過(guò),除非確實(shí)需要一些標(biāo)準(zhǔn)庫(kù)中沒(méi)有的功能,我依然會(huì)使用 json。SImplejson 可能比 json快很多,因?yàn)樗囊徊糠质怯肅實(shí)現(xiàn)的。但是除非你要處理幾千個(gè) JSON 文件,否則這點(diǎn)速度提升并不明顯。此外還可以看看 UltraJSON,這是個(gè)幾乎完全用C編寫(xiě)的包,應(yīng)該速度更快。
“學(xué)習(xí)Python常用的庫(kù)有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!