python的優(yōu)點(diǎn)在于有大量3的內(nèi)置模塊和第三方模塊,使用這些模塊我們可以方便地實(shí)現(xiàn)需要的功能允趟。本文主要介紹python的模塊結(jié)構(gòu)及常用的內(nèi)置模塊和第三方模塊。
1. 模塊簡(jiǎn)介
模塊即包括python聲明及定義的文件。一個(gè)python文件就是一個(gè)模塊掸掸。如編寫一個(gè)test.py文件,我們需要將這個(gè)文件作為模塊導(dǎo)入蹭秋,只需要這樣寫:import test 扰付。這樣我們就把test.py作為模塊導(dǎo)入到當(dāng)前文件,可以使用該模塊定義的功能仁讨。模塊名可以使用全局變量__name__得到羽莺。
import os
import re
from datetime import datetime
print(os.__name__)
print(re.__name__)
if __name__ == "__main__":
pass
# 結(jié)果
os
re
在上面代碼中,可以看到有一行:if __name__ == "__main__":洞豁,這行代碼為模塊提供了一個(gè)便于測(cè)試的用戶接口盐固。當(dāng)我們直接運(yùn)行該文件時(shí),__name__變量值為"__main__"丈挟,結(jié)果為True刁卜,可直接運(yùn)行。當(dāng)作為第三方模塊導(dǎo)入時(shí)曙咽,__name__變量為模塊名蛔趴,結(jié)果為False,不能運(yùn)行該文件例朱,但我們可使用該文件內(nèi)部定義的功能孝情。因此我們編寫python文件時(shí),通常在該行代碼上面定義功能(函數(shù)洒嗤、類等)箫荡,在下面定義執(zhí)行代碼,便于檢驗(yàn)功能正確性渔隶。
除此之外羔挡,我們可以使用包來(lái)組織模塊,避免模塊名的沖突。實(shí)質(zhì)上婉弹,包就是一個(gè)包含多個(gè)python文件的目錄睬魂。注意:該目錄下一定有一個(gè)__init__.py文件,該文件表示當(dāng)前目錄是一個(gè)包镀赌。除此之外氯哮,包目錄下一般有一個(gè)__pycache__目錄,該目錄會(huì)緩存每個(gè)模塊編譯后的文件(.pyc文件:)商佛。執(zhí)行某個(gè)模塊時(shí)喉钢,會(huì)檢查源文件與編譯版文件的修改日期確定是否需要重新編譯。當(dāng)我們導(dǎo)入模塊時(shí)良姆,解釋器會(huì)搜索當(dāng)前目錄肠虽,所有已安裝模塊和第三方模塊。搜索路徑可通過(guò)sys模塊的path變量獲取玛追。如:
>>> import sys
>>> sys.path
['D:\\software\\PyCharm 2018.1.1\\helpers\\pydev', 'E:\\Code exercise\\Code-exercise\\python', 'E:\\graduation-project', 'D:\\software\\PyCharm 2018.1.1\\helpers\\pydev', 'E:\\env-python\\Scripts\\python36.zip', 'E:\\env-python\\DLLs', 'E:\\env-python\\lib', 'E:\\env-python\\Scripts', 'd:\\software\\python3\\Lib', 'd:\\software\\python3\\DLLs', 'E:\\env-python', 'E:\\env-python\\lib\\site-packages', 'E:\\env-python\\lib\\site-packages\\dlib-19.10.0-py3.6-win-amd64.egg', 'D:\\software\\PyCharm 2018.1.1\\helpers\\pycharm_matplotlib_backend', 'E:\\Code exercise\\Code-exercise\\python', 'E:\\graduation-project', 'E:/Code exercise/Code-exercise/python']
2. 常用內(nèi)置模塊
2.1 os模塊
os模塊封裝了常見的文件和目錄操作税课。下面列舉常用的方法:
附菜鳥教程的os模塊:https://www.runoob.com/python3/python3-os-file-methods.html
2.2 日期時(shí)間模塊
附菜鳥教程的時(shí)間日期模塊參考:https://www.runoob.com/python3/python3-date-time.html
time模塊
time模塊包含多個(gè)有關(guān)時(shí)間處理的函數(shù)。下表顯示常用方法:
方法 | 說(shuō)明 |
---|---|
time.time() | 返回以秒為單位的浮點(diǎn)數(shù)時(shí)間(unix時(shí)間戳痊剖,從1970-01-01 00:00:00 UTC) |
time.clock() | 返回處理器時(shí)間 |
time.sleep() | 休眠n秒 |
time.ctime() | 將以秒表示的時(shí)間(time.time())轉(zhuǎn)換為當(dāng)?shù)貢r(shí)間的字符串 |
time.localtime() | 將秒為單位的時(shí)間轉(zhuǎn)換為表示當(dāng)?shù)貢r(shí)間的時(shí)間元組 |
time.gmtime() | 將秒為單位的時(shí)間轉(zhuǎn)換為UTC時(shí)間的時(shí)間元組 |
time.asctime() | 將時(shí)間元組轉(zhuǎn)換為當(dāng)?shù)貢r(shí)間的字符串 |
time.mktime() | 將時(shí)間元組轉(zhuǎn)換為掛鐘時(shí)間 |
import time
print(time.time()) # 返回以秒為單位的浮點(diǎn)數(shù)時(shí)間(unix時(shí)間戳韩玩,從1970-01-01 00:00:00 UTC)
print(time.clock()) # 返回處理器時(shí)間
print(time.ctime()) # 將以秒表示的時(shí)間(time.time())轉(zhuǎn)換為當(dāng)?shù)貢r(shí)間的字符串
for x in range(3):
print('hello world')
time.sleep(0.1) # 休眠n秒
print(time.asctime()) # 將時(shí)間元組轉(zhuǎn)換為當(dāng)?shù)貢r(shí)間的字符串
print(time.localtime()) # 將秒為單位的時(shí)間轉(zhuǎn)換為表示當(dāng)?shù)貢r(shí)間的時(shí)間元組
print(time.gmtime()) # 將秒為單位的時(shí)間轉(zhuǎn)換為UTC時(shí)間的時(shí)間元組
print(time.mktime(time.localtime())) # 將時(shí)間元組轉(zhuǎn)換為掛鐘時(shí)間
# 結(jié)果
1525878891.406281
4.276538056912168e-07
Wed May 9 23:14:51 2018
hello world
hello world
hello world
Wed May 9 23:14:51 2018
time.struct_time(tm_year=2018, tm_mon=5, tm_mday=9, tm_hour=23, tm_min=14, tm_sec=51, tm_wday=2, tm_yday=129, tm_isdst=0)
time.struct_time(tm_year=2018, tm_mon=5, tm_mday=9, tm_hour=15, tm_min=14, tm_sec=51, tm_wday=2, tm_yday=129, tm_isdst=0)
1525878891.0
datetime模塊
datetime模塊對(duì)time模塊進(jìn)行了封裝。包含多個(gè)有關(guān)日期時(shí)間處理的函數(shù)陆馁。
方法 | 說(shuō)明 |
---|---|
datetime.now() | 返回一個(gè)datetime對(duì)象找颓,表示當(dāng)?shù)貢r(shí)間 |
datetime.utcnow() | 返回一個(gè)datetime對(duì)象,表示UTC時(shí)間 |
object_datetime.timestamp() | 將一個(gè)datetime對(duì)象轉(zhuǎn)換為unix時(shí)間戳 |
datetime.fromtimestamp() | 將Unix時(shí)間戳轉(zhuǎn)換為datetime對(duì)象 |
datetime.strftime() | 將datetime對(duì)象格式化輸出為字符串 |
datetime.strptime() | 將時(shí)間字符串轉(zhuǎn)換為datetime對(duì)象 |
from datetime import datetime
print(datetime.now()) # 返回一個(gè)datetime對(duì)象叮贩,表示當(dāng)?shù)貢r(shí)間
print(datetime.utcnow()) # 返回一個(gè)datetime對(duì)象击狮,表示UTC時(shí)間
test_time = datetime.utcnow()
print(test_time.timestamp()) # 將一個(gè)datetime對(duì)象轉(zhuǎn)換為unix時(shí)間戳
print(datetime.fromtimestamp(1525849091.98994)) # 將Unix時(shí)間戳轉(zhuǎn)換為datetime對(duì)象
print(datetime.strftime(datetime.now(), '%Y-%m-%d %H:%M:%S.%f')) # 將datetime對(duì)象格式化輸出為字符串
print(datetime.strptime('2018-05-09 23:04:12.119774', '%Y-%m-%d %H:%M:%S.%f')) # 將時(shí)間字符串轉(zhuǎn)換為datetime對(duì)象
# 結(jié)果
2018-05-09 23:14:51.708639
2018-05-09 15:14:51.708639
1525850091.708639
2018-05-09 14:58:11.989940
2018-05-09 23:14:51.708639
2018-05-09 23:04:12.119774
2.3 collections模塊
python內(nèi)置的集合模塊,提供很多有用的集合類益老。
namedtuple:命名元組彪蓬,為一個(gè)函數(shù),可用來(lái)創(chuàng)建一個(gè)自定義的tuple對(duì)象捺萌。其可規(guī)定元素的個(gè)數(shù)寞焙,并可使用屬性(不是索引)來(lái)訪問(wèn)某個(gè)元素 語(yǔ)法:namedtuple('name', [元素])
import collections
Circle = collections.namedtuple('Circle', ['x', 'y', 'z'])
print(isinstance(Circle, tuple))
circle = Circle(5, 6, 7)
print(circle.x, circle.y, circle.z)
# 執(zhí)行結(jié)果
False
5 6 7
deque:列表list為先行存儲(chǔ),數(shù)據(jù)量較大時(shí)互婿,插入刪除效率較低。deque是可實(shí)現(xiàn)高效插入和刪除的雙向列表辽狈,適合用于隊(duì)列和棧慈参。deque不僅實(shí)現(xiàn)了list的append和pop,還支持appendleft()和popleft().
import collections
deque_list = collections.deque([1, 2, 3])
print(type(deque_list))
deque_list.appendleft(5)
deque_list.append(6)
print(deque_list)
# 執(zhí)行結(jié)果
<class 'collections.deque'>
deque([5, 1, 2, 3, 6])
2.4 hashlib模塊
提供常用的摘要算法刮萌,如MD5,SHA1等驮配。摘要算法:通過(guò)一個(gè)函數(shù),將任意長(zhǎng)度的數(shù)據(jù)轉(zhuǎn)換為一個(gè)長(zhǎng)度固定的數(shù)據(jù)串(通常用16進(jìn)制的字符串表示)
import hashlib
md5 = hashlib.md5()
md5.update("how to use md5 in python hashlib?".encode('utf-8'))
print(md5.hexdigest())
# 執(zhí)行結(jié)果
d26a53750bc40b38b65a520292f69306
2.5 urllib模塊
提供了一系列操作URL的功能,可用來(lái)模擬瀏覽器執(zhí)行g(shù)et post等請(qǐng)求
from urllib import request
with request.urlopen("http://www.baidu.com") as f:
data = f.read()
print("status:", f.status, f.reason)
for k, v in f.getheaders():
print("%s: %s" % (k, v))
print('Data:', data.decode('utf-8'))