python的優(yōu)點在于有大量3的內(nèi)置模塊和第三方模塊,使用這些模塊我們可以方便地實現(xiàn)需要的功能。本文主要介紹python的模塊結(jié)構(gòu)及常用的內(nèi)置模塊和第三方模塊。
1. 模塊簡介
模塊即包括python聲明及定義的文件。一個python文件就是一個模塊。如編寫一個test.py文件,我們需要將這個文件作為模塊導(dǎo)入,只需要這樣寫:import test 。這樣我們就把test.py作為模塊導(dǎo)入到當前文件,可以使用該模塊定義的功能。模塊名可以使用全局變量__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__":,這行代碼為模塊提供了一個便于測試的用戶接口。當我們直接運行該文件時,__name__變量值為"__main__",結(jié)果為True,可直接運行。當作為第三方模塊導(dǎo)入時,__name__變量為模塊名,結(jié)果為False,不能運行該文件,但我們可使用該文件內(nèi)部定義的功能。因此我們編寫python文件時,通常在該行代碼上面定義功能(函數(shù)、類等),在下面定義執(zhí)行代碼,便于檢驗功能正確性。
除此之外,我們可以使用包來組織模塊,避免模塊名的沖突。實質(zhì)上,包就是一個包含多個python文件的目錄。注意:該目錄下一定有一個__init__.py文件,該文件表示當前目錄是一個包。除此之外,包目錄下一般有一個__pycache__目錄,該目錄會緩存每個模塊編譯后的文件(.pyc文件:)。執(zhí)行某個模塊時,會檢查源文件與編譯版文件的修改日期確定是否需要重新編譯。當我們導(dǎo)入模塊時,解釋器會搜索當前目錄,所有已安裝模塊和第三方模塊。搜索路徑可通過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 日期時間模塊
附菜鳥教程的時間日期模塊參考:https://www.runoob.com/python3/python3-date-time.html
time模塊
time模塊包含多個有關(guān)時間處理的函數(shù)。下表顯示常用方法:
| 方法 | 說明 |
|---|---|
| time.time() | 返回以秒為單位的浮點數(shù)時間(unix時間戳,從1970-01-01 00:00:00 UTC) |
| time.clock() | 返回處理器時間 |
| time.sleep() | 休眠n秒 |
| time.ctime() | 將以秒表示的時間(time.time())轉(zhuǎn)換為當?shù)貢r間的字符串 |
| time.localtime() | 將秒為單位的時間轉(zhuǎn)換為表示當?shù)貢r間的時間元組 |
| time.gmtime() | 將秒為單位的時間轉(zhuǎn)換為UTC時間的時間元組 |
| time.asctime() | 將時間元組轉(zhuǎn)換為當?shù)貢r間的字符串 |
| time.mktime() | 將時間元組轉(zhuǎn)換為掛鐘時間 |
import time
print(time.time()) # 返回以秒為單位的浮點數(shù)時間(unix時間戳,從1970-01-01 00:00:00 UTC)
print(time.clock()) # 返回處理器時間
print(time.ctime()) # 將以秒表示的時間(time.time())轉(zhuǎn)換為當?shù)貢r間的字符串
for x in range(3):
print('hello world')
time.sleep(0.1) # 休眠n秒
print(time.asctime()) # 將時間元組轉(zhuǎn)換為當?shù)貢r間的字符串
print(time.localtime()) # 將秒為單位的時間轉(zhuǎn)換為表示當?shù)貢r間的時間元組
print(time.gmtime()) # 將秒為單位的時間轉(zhuǎn)換為UTC時間的時間元組
print(time.mktime(time.localtime())) # 將時間元組轉(zhuǎn)換為掛鐘時間
# 結(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模塊對time模塊進行了封裝。包含多個有關(guān)日期時間處理的函數(shù)。
| 方法 | 說明 |
|---|---|
| datetime.now() | 返回一個datetime對象,表示當?shù)貢r間 |
| datetime.utcnow() | 返回一個datetime對象,表示UTC時間 |
| object_datetime.timestamp() | 將一個datetime對象轉(zhuǎn)換為unix時間戳 |
| datetime.fromtimestamp() | 將Unix時間戳轉(zhuǎn)換為datetime對象 |
| datetime.strftime() | 將datetime對象格式化輸出為字符串 |
| datetime.strptime() | 將時間字符串轉(zhuǎn)換為datetime對象 |
from datetime import datetime
print(datetime.now()) # 返回一個datetime對象,表示當?shù)貢r間
print(datetime.utcnow()) # 返回一個datetime對象,表示UTC時間
test_time = datetime.utcnow()
print(test_time.timestamp()) # 將一個datetime對象轉(zhuǎn)換為unix時間戳
print(datetime.fromtimestamp(1525849091.98994)) # 將Unix時間戳轉(zhuǎn)換為datetime對象
print(datetime.strftime(datetime.now(), '%Y-%m-%d %H:%M:%S.%f')) # 將datetime對象格式化輸出為字符串
print(datetime.strptime('2018-05-09 23:04:12.119774', '%Y-%m-%d %H:%M:%S.%f')) # 將時間字符串轉(zhuǎn)換為datetime對象
# 結(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:命名元組,為一個函數(shù),可用來創(chuàng)建一個自定義的tuple對象。其可規(guī)定元素的個數(shù),并可使用屬性(不是索引)來訪問某個元素 語法: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為先行存儲,數(shù)據(jù)量較大時,插入刪除效率較低。deque是可實現(xiàn)高效插入和刪除的雙向列表,適合用于隊列和棧。deque不僅實現(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等。摘要算法:通過一個函數(shù),將任意長度的數(shù)據(jù)轉(zhuǎn)換為一個長度固定的數(shù)據(jù)串(通常用16進制的字符串表示)
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的功能,可用來模擬瀏覽器執(zhí)行g(shù)et post等請求
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'))