文章目錄
- 一、常用标準庫
- 二、os庫
- `2.1.常用子產品方法`
- `2.2.os.path子子產品`
- `2.3.周遊目錄`
- 三、sys庫
- 四、platform
- 五、glob
- 六、random
- 七、subprocess
- 八、pickle
- 九、json
- `9.1.示例:字典與json互換`
- 十、time
- 十一、datetime
- `11.1.練習:計算時間差額,如100天零4小時前、100天零4小時後是什麼時候`
- 十二、urllib
- `12.1.示例1:自定義使用者代理`
- `12.2.示例2:向接口送出使用者資料`
- 十三、hashlib子產品
- 十四、tarfile子產品
- 十五、shutil
- 十六、requests請問url
- `get`請求
- `post請求`
一、常用标準庫

官方文檔标準庫清單:https://docs.python.org/zh-cn/3.8/library/index.html
二、os庫
os庫主要對目标和檔案操作
2.1.常用子產品方法
2.1.常用子產品方法
>>> import os
>>> os.getcwd() # pwd
>>> os.chdir('/tmp') # cd /tmp
>>> os.listdir('/tmp') # ls /tmp
>>> os.makedirs('/tmp/mydemo/mydir') # mkdir -p建立多級目錄
>>> os.mkdir('/tmp/abcde') # mkdir
>>> os.rmdir('/tmp/abcde') # rmdir
>>> os.chdir('/tmp/mydemo/mydir') # cd /tmp/mydemo/mydir
>>> os.mknod('hello') # touch hello
>>> os.symlink('/etc/hosts', 'zhuji') # ln -s /etc/hosts zhuji
>>> os.chmod('hello', 0o644) # chmod 644 hello
>>> os.rename('hello', 'welcome') # mv hello welcome
>>> os.unlink('zhuji') # unlink zhuji # 删除軟連結
>>> os.remove('welcome') # rm -f welcome
2.2.os.path子子產品
2.2.os.path子子產品
>>> os.path.abspath('.') # 目前路徑的絕對路徑;擷取目前檔案的絕對路徑
'/tmp/mydemo/mydir'
>>> os.path.dirname('/tmp/demo/abc.txt')
'/tmp/demo'
>>> os.path.basename('/tmp/demo/abc.txt')
'abc.txt'
>>> os.path.join('/tmp/demo', 'abc.txt') # 路徑拼接
'/tmp/demo/abc.txt'
>>> os.path.split('/tmp/a.txt') # 分割路徑為一個元組
('/tmp', 'a.txt')
>>> os.path.splitext('/tmp/a.txt')[1] # 擷取檔案字尾
'.txt'
>>> os.path.isdir('/etc') # 存在并且是目錄嗎?
True
>>> os.path.isfile('/etc/hosts') # 存在并且是檔案嗎?
True
>>> os.path.islink('/etc/passwd') # 存在并且是連結嗎?
False
>>> os.path.ismount('/') # 存在并且是挂載點嗎?
True
>>> os.path.exists('/abcd') # 存在嗎?
False
2.3.周遊目錄
2.3.周遊目錄
>>> for dirpath,dirname,filename in os.walk('/tmp'):
... print(f"目錄路徑:{dirpath},目錄名:{dirname},檔案名:{filename}")
三、sys庫
sys庫用于與Python解釋器互動
>>> import sys
>>> sys.path #擷取Python解釋器查找子產品的路徑,類似于shell的$PATH
四、platform
用于擷取作業系統詳細資訊
五、glob
用于檔案查找,支援通配符(*、?、[])
>>> glob.glob('/home/user/*.sh') #查找目錄中所有以.sh為字尾的檔案
['/home/user/b.sh', '/home/user/a.sh', '/home/user/sum.sh']
>>> glob.glob('/home/user/?.sh') #查找目錄中出現單個字元并以.sh為字尾的檔案
['/home/user/b.sh', '/home/user/a.sh']
>>> glob.glob('/home/user/[a|b].sh') #查找目錄中出現a.sh或b.sh的檔案
['/home/user/b.sh', '/home/user/a.sh']
六、random
用于生成随機數
>>> import random
>>> alist = list(range(1,10))
>>> alist
[1, 2, 3, 4, 5, 6, 7, 8, 9]
#随機取出一個數
>>> random.choice(alist)
9
#對清單洗牌
>>> random.shuffle(alist)
>>> alist
[8, 5, 4, 6, 1, 7, 9, 2, 3]
#對清單取樣
>>> random.sample(alist, 2)
[8, 6]
七、subprocess
subprocess庫用于執行Shell指令,工作時會fork一個子程序去執行任務,連接配接到子程序的标準輸入、輸出、錯誤,并獲得它們的傳回代碼。
這個子產品将取代os.system、os.spawn*、os.popen*、popen2.和commands.。
subprocess的主要方法:
subprocess.run(),subprocess.Popen(),subprocess.call
文法:subprocess.run(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, check=False, encoding=None)
>>> import subprocess
>>> subprocess.run('ls /home', shell=True)
#傳回值
>>> rc = subprocess.run('ping -c2 -i0.2 -w1 192.168.74.133 &>/dev/null', shell=True)
>>> rc.returncode #類似于$?
#捕獲輸出
>>> rc = subprocess.run('id root; id ddd', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> rc.returncode
1
>>> rc.stdout.decode()
'uid=0(root) gid=0(root) groups=0(root)\n'
八、pickle
pickle子產品實作了對一個Python對象結構的二進制序列化和反序列化。
主要用于将對象持久化到檔案存儲。
pickle子產品主要有兩個函數:
• dump() 把對象儲存到檔案中(序列化),使用load()函數從檔案中讀取(反序列化)
• dumps() 把對象儲存到記憶體中,使用loads()函數讀取
>>> import pickle
>>> shopping_list = ['apple', 'banana', 'orage']
>>> with open('/tmp/shop.data', 'wb') as fobj:
... pickle.dump(shopping_list, fobj) # 序列化
# 取出資料,還是清單的形式
>>> with open('/tmp/shop.data', 'rb') as fobj:
... mylist = pickle.load(fobj) # 反序列化
>>> mylist
['apple', 'banana', 'orage']
九、json
JSON是一種輕量級資料交換格式,一般API傳回的資料大多是JSON、XML,如果傳回JSON的話,需将擷取的資料轉換成字典,方面在程式中處理。
json與pickle有相似的接口,主要提供兩種方法:
• dumps() 對資料進行編碼
• loads() 對資料進行解碼
9.1.示例:字典與json互換
9.1.示例:字典與json互換
import json
computer = {"主機":5000,"顯示器":1000,"滑鼠":60,"鍵盤":150}
json_obj = json.dumps(computer)
print(json_obj)
# 将JSON對象轉換為字典
data = json.loads(json_obj)
print(data)
十、time
用于滿足簡單的時間處理,例如擷取目前時間戳、日期、時間、休眠。
>>> import time
>>> time.time() #1970-1-1 0:00:00 到目前時間的秒數
>>> time.ctime() #UTC時間
'Mon Jan 27 10:10:59 2020'
#九元組struct_time
>>> time.localtime()
time.struct_time(tm_year=2020, tm_mon=1, tm_mday=27, tm_hour=10, tm_min=11, tm_sec=20, tm_wday=0, tm_yday=27, tm_isdst=0)
>>> t = time.localtime()
>>> t.tm_year
2020
>> time.sleep(3) # 睡眠3秒
>>> time.strftime('%Y-%m-%d %H:%M:%S')
'2022-01-28 11:46:25
十一、datetime
用于處理更複雜的日期和時間
>>> from datetime import datetime,date
>>> t1 = datetime.now()
>>> t1
datetime.datetime(2020, 1, 27, 10, 21, 39, 621714)
>>> t1.year, t1.month, t1.day, t1.hour, t1.minute, t1.second, t1.microsecond
(2020, 1, 27, 10, 21, 39, 621714)
# 将datetime對象轉成時間字元串
>>> datetime.strftime(t1, '%Y-%m-%d %H:%M:%S')
'2019-07-08 10:55:17'
# 将時間字元串轉換成datetime對象
>>> datetime.strptime('2019-07-08 10:55:17', '%Y-%m-%d %H:%M:%S')
datetime.datetime(2019, 7, 8, 10, 55, 17)
# 建立指定時間的datetime對象
>>> t = datetime(2019, 7, 8)
>>> t
datetime.datetime(2019, 7, 8, 0, 0)
>>> print(date.today()) #列印年月日
2021-01-10
11.1.練習:計算時間差額,如100天零4小時前、100天零4小時後是什麼時候
11.1.練習:計算時間差額,如100天零4小時前、100天零4小時後是什麼時候
>>> from datetime import datetime, timedelta
>>> dt = timedelta(days=100, hours=4)
>>> t = datetime.now()
>>> t
datetime.datetime(2019, 7, 8, 11, 38, 13, 922027)
>>> t - dt
datetime.datetime(2019, 3, 30, 7, 38, 13, 922027)
>>> t + dt
datetime.datetime(2019, 10, 16, 15, 38, 13, 922027)
十二、urllib
用于通路URL
urllib包含以下類:
• urllib.request 打開和讀取 URL
• urllib.error 包含 urllib.request 抛出的異常
• urllib.parse 用于解析 URL
• urllib.robotparser 用于解析 robots.txt 檔案
用的最多是urllib.request 類,它定義了适用于在各種複雜情況下打開 URL,例如基本認證、重定向、Cookie、代理等。
from urllib import request
res = request.urlopen("http://www.ctnrs.com")
res是一個HTTPResponse類型的對象,包含以下方法和屬性
12.1.示例1:自定義使用者代理
12.1.示例1:自定義使用者代理
from urllib import request
url = "http://www.ctnrs.com"
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108Safari/537.36"
header = {"User-Agent": user_agent}
req = request.Request(url, headers=header)
res = request.urlopen(req)
print(res.getcode())
12.2.示例2:向接口送出使用者資料
12.2.示例2:向接口送出使用者資料
from urllib import request, parse
url = "http://www.ctnrs.com/login"
post_data = {"username":"user1","password":"123456"}
post_data = parse.urlencode(post_data).encode("utf8") #将字典轉為URL查詢字元串格式,并轉為bytes類型
req = request.Request(url, data=post_data, headers=header)
res = request.urlopen(req)
print(res.read())
十三、hashlib子產品
用于計算檔案的哈希值
# 計算檔案的md5值
>>> with open('/etc/passwd', 'rb') as fobj:
... data = fobj.read()
>>> m = hashlib.md5(data)
>>> m.hexdigest()
'decb544ed171583bb1d7722500910d9e'
十四、tarfile子產品
# 壓縮
>>> import tarfile
>>> tar = tarfile.open('/tmp/mytest.tar.gz', 'w:gz') # 用gzip壓縮
>>> tar.add('/etc/hosts') # 壓縮單個檔案
>>> tar.add('/etc/security') # 壓縮目錄
>>> tar.close() # 關閉
# 解壓
>>> tar = tarfile.open('/tmp/mytest.tar.gz') # 自動識别壓縮格式,以讀方式打開
>>> tar.extractall(path='/var/tmp') # 指定解壓目錄,預設解到目前目錄
>>> tar.close()
十五、shutil
>>> import shutil
>>> shutil.copy2('/bin/ls', '/tmp/list7') #相當于cp -p
>>> shutil.copytree('/etc/security', '/tmp/security') #相當于cp -r
>>> shutil.move('/tmp/security', '/var/tmp/anquan') #相當于mv
>>> shutil.rmtree('/var/tmp/anquan') #相當于rm -rf
十六、requests請問url
get
請求
get
import requests
from requests.auth import HTTPBasicAuth
url = "http://192.168.1.2:8088/artifactory/release/"
username = "admin"
password = "123456"
res = requests.get(url,auth=HTTPBasicAuth(username,password )
data = req.text # 傳回網頁内容,類型為字元串
post請求
post請求