Python系統(tǒng)交互庫(kù)解析過(guò)程
系統(tǒng)交互庫(kù)
os 模塊
os 模塊提供了跨平臺(tái)的文件和目錄操作方法,是 Python 標(biāo)準(zhǔn)庫(kù)中最常用的系統(tǒng)接口之一:
文件操作:
os.rename(src, dst)- 重命名文件或目錄os.remove(path)- 刪除文件(不能刪除目錄)
os.path 子模塊提供:
os.path.exists(path)- 檢查路徑是否存在os.path.isfile(path)/os.path.isdir(path)- 判斷路徑類(lèi)型os.path.getsize(path)- 獲取文件大小
目錄操作:
os.mkdir(path)- 創(chuàng)建單個(gè)目錄os.makedirs(path)- 遞歸創(chuàng)建多級(jí)目錄os.listdir(path)- 列出目錄內(nèi)容os.chdir(path)- 改變當(dāng)前工作目錄os.walk(top)- 目錄樹(shù)生成器,遞歸遍歷
路徑處理:
os.path.join(path1, path2)- 智能拼接路徑(跨平臺(tái)兼容)os.path.abspath(path)- 獲取絕對(duì)路徑os.path.dirname(path)/os.path.basename(path)- 獲取目錄名/文件名os.path.splitext(path)- 分離文件名和擴(kuò)展名
系統(tǒng)信息:
os.name- 操作系統(tǒng)名稱(chēng)('posix', 'nt', 'java')os.environ- 環(huán)境變量字典os.getcwd()- 獲取當(dāng)前工作目錄os.cpu_count()- 獲取CPU核心數(shù)
sys 模塊
sys 模塊實(shí)現(xiàn)了與 Python 解釋器的深度交互:
命令行參數(shù):
sys.argv- 腳本參數(shù)列表(第一個(gè)元素是腳本名稱(chēng))- 示例:
python script.py arg1 arg2→sys.argv = ['script.py', 'arg1', 'arg2']
模塊搜索路徑:
sys.path- Python 模塊搜索路徑列表- 可動(dòng)態(tài)修改:
sys.path.append('/custom/path')
標(biāo)準(zhǔn)輸入輸出:
sys.stdin/sys.stdout/sys.stderr- 標(biāo)準(zhǔn) I/O 流對(duì)象- 重定向示例:
sys.stdout = open('output.log', 'w')
print("這將寫(xiě)入文件")
解釋器信息:
sys.version- Python 版本信息sys.platform- 操作系統(tǒng)平臺(tái)標(biāo)識(shí)符sys.executable- Python 解釋器路徑sys.exit([status])- 退出程序(0表示成功)
其他重要功能:
sys.getsizeof(obj)- 獲取對(duì)象占用的內(nèi)存大小sys.getrecursionlimit()- 獲取遞歸深度限制sys.settrace()- 設(shè)置跟蹤函數(shù)用于調(diào)試
subprocess 模塊
subprocess 提供了更安全的進(jìn)程管理方式,替代傳統(tǒng)的 os.system():
基本用法:
# 運(yùn)行簡(jiǎn)單命令
result = subprocess.run(["ls", "-l"], capture_output=True, text=True)
print(result.stdout)
# 檢查返回碼
if result.returncode != 0:
print("命令執(zhí)行失敗")
高級(jí)控制:
subprocess.Popen()- 創(chuàng)建子進(jìn)程并返回句柄
proc = subprocess.Popen(["python", "worker.py"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
管道連接:
subprocess.PIPE- 創(chuàng)建管道
p1 = subprocess.Popen(["cat", "file.txt"], stdout=subprocess.PIPE) p2 = subprocess.Popen(["grep", "keyword"], stdin=p1.stdout, stdout=subprocess.PIPE)
錯(cuò)誤處理:
subprocess.CalledProcessError- 命令返回非零狀態(tài)時(shí)拋出- 安全執(zhí)行:
try:
subprocess.run(["rm", "important_file"], check=True)
except subprocess.CalledProcessError as e:
print(f"命令失敗: {e}")
其他功能:
timeout參數(shù) - 設(shè)置命令超時(shí)時(shí)間shell=True- 通過(guò)系統(tǒng)shell執(zhí)行命令(有安全風(fēng)險(xiǎn))env參數(shù) - 設(shè)置子進(jìn)程環(huán)境變量
遠(yuǎn)程管理工具
paramiko 庫(kù)
paramiko 是純 Python 實(shí)現(xiàn)的 SSHv2 協(xié)議庫(kù):
SSH 連接:
import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('hostname', username='user', password='pass')
執(zhí)行命令:
stdin, stdout, stderr = client.exec_command('ls -l')
print(stdout.read().decode())
文件傳輸:
sftp = client.open_sftp()
sftp.put('local.txt', 'remote.txt') # 上傳
sftp.get('remote.txt', 'local.txt') # 下載
sftp.close()
密鑰認(rèn)證:
key = paramiko.RSAKey.from_private_key_file('/path/to/key.pem')
client.connect('host', username='user', pkey=key)
高級(jí)功能:
- SSH 隧道
- 保持連接
- 主機(jī)密鑰驗(yàn)證
- 交互式 shell
Fabric 工具
Fabric2 是新一代的批量任務(wù)框架,構(gòu)建在 Paramiko 之上:
任務(wù)定義:
from fabric import task
@task
def deploy(c):
c.run('git pull')
c.run('pip install -r requirements.txt')
主機(jī)管理:
@task
def check_disk(c):
# 單個(gè)連接
result = c.run('df -h', hide=True)
print(f"磁盤(pán)使用:\n{result.stdout}")
# 多主機(jī)
for connection in c:
with connection.cd('/var/log'):
connection.run('ls -l')
批量執(zhí)行:
from fabric import Connection, ThreadingGroup
hosts = ['web1', 'web2', 'db1']
group = ThreadingGroup(*hosts, user='admin')
result = group.run('hostname')
for connection, result in result.items():
print(f"{connection.host}: {result.stdout.strip()}")
配置系統(tǒng):
fabric.yml配置文件:
user: deploy connect_kwargs: key_filename: /path/to/key.pem hosts: - web1.example.com - web2.example.com
- 或通過(guò) Python 配置:
c = Connection('host', user='user', connect_kwargs={'password': 'pass'})
其他特性:
- 并行執(zhí)行
- 失敗處理
- 上下文管理器
- 本地和遠(yuǎn)程操作混合
網(wǎng)絡(luò)通信庫(kù)
socket 模塊
socket 提供底層網(wǎng)絡(luò)接口:
TCP 通信:
# 服務(wù)器端
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 8000))
server_socket.listen(1)
conn, addr = server_socket.accept()
# 客戶端
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8000))
UDP 通信:
# 服務(wù)器端
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.bind(('0.0.0.0', 8000))
data, addr = udp_socket.recvfrom(1024)
# 客戶端
udp_socket.sendto(b'Hello', ('localhost', 8000))
常用方法:
socket.settimeout()- 設(shè)置超時(shí)時(shí)間socket.getaddrinfo()- 地址解析socket.gethostname()- 獲取主機(jī)名socket.shutdown()- 優(yōu)雅關(guān)閉連接
高級(jí)功能:
- 非阻塞 I/O
- 套接字選項(xiàng)設(shè)置
- 多路復(fù)用 (select/poll)
- SSL 包裝
requests 庫(kù)
requests 提供了人性化的 HTTP 客戶端:
簡(jiǎn)單請(qǐng)求:
# GET 請(qǐng)求
response = requests.get('https://api.example.com/data')
print(response.json())
# POST 請(qǐng)求
payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://api.example.com/post', data=payload)
參數(shù)傳遞:
params- URL 查詢參數(shù)
requests.get('https://api.example.com/search', params={'q': 'python'})
json- JSON 請(qǐng)求體
requests.post('https://api.example.com/data', json={'key': 'value'})
會(huì)話保持:
session = requests.Session()
session.get('https://example.com/login', auth=('user', 'pass'))
response = session.get('https://example.com/dashboard')
高級(jí)功能:
- 代理支持:
proxies = {'http': 'http://proxy.example.com:8080'}
requests.get('http://example.com', proxies=proxies)
- 超時(shí)設(shè)置:
requests.get('http://example.com', timeout=5)
- SSL 驗(yàn)證:
requests.get('https://example.com', verify='/path/to/cert.pem')
響應(yīng)處理:
response.status_code- HTTP 狀態(tài)碼response.headers- 響應(yīng)頭response.content- 二進(jìn)制響應(yīng)體response.text- 文本響應(yīng)體response.json()- JSON 解析
數(shù)據(jù)處理工具
json 模塊
json 模塊用于 API 數(shù)據(jù)交互:
序列化:
data = {'name': 'Alice', 'age': 30, 'skills': ['Python', 'SQL']}
json_str = json.dumps(data, indent=2) # 美化輸出
反序列化:
data = json.loads('{"name": "Alice", "age": 30}')
文件操作:
# 寫(xiě)入文件
with open('data.json', 'w') as f:
json.dump(data, f)
# 讀取文件
with open('data.json') as f:
data = json.load(f)
高級(jí)功能:
- 自定義編碼器:
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
return super().default(obj)
json.dumps(obj, cls=CustomEncoder)
- 解析參數(shù):
json.loads(json_str, object_hook=my_decoder)
csv 模塊
csv 模塊用于報(bào)表生成:
讀取 CSV:
with open('data.csv') as f:
reader = csv.reader(f)
for row in reader:
print(row)
寫(xiě)入 CSV:
with open('output.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Name', 'Age'])
writer.writerow(['Alice', 30])
字典格式:
# 讀取
with open('data.csv') as f:
reader = csv.DictReader(f)
for row in reader:
print(row['Name'], row['Age'])
# 寫(xiě)入
with open('output.csv', 'w') as f:
fieldnames = ['Name', 'Age']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'Name': 'Alice', 'Age': 30})
方言支持:
csv.register_dialect('mydialect', delimiter='|', quoting=csv.QUOTE_MINIMAL)
with open('data.psv') as f:
reader = csv.reader(f, dialect='mydialect')
yaml 模塊
yaml 用于配置文件解析:
基本用法:
import yaml
# 解析 YAML
with open('config.yaml') as f:
config = yaml.safe_load(f)
# 生成 YAML
data = {'server': {'host': '127.0.0.1', 'port': 8000}}
yaml_str = yaml.dump(data, default_flow_style=False)
高級(jí)特性:
- 錨點(diǎn)和別名:
defaults: &defaults adapter: postgres host: localhost development: <<: *defaults database: dev
- 自定義標(biāo)簽
- 多文檔流
安全考慮:
- 始終優(yōu)先使用
yaml.safe_load()而非yaml.load() - 避免加載不受信任的 YAML 文件
- 復(fù)雜對(duì)象需要自定義表示器/構(gòu)造器
與其他格式對(duì)比:
- 比 JSON 更易讀
- 支持注釋
- 比 XML 更簡(jiǎn)潔
- 適合配置文件和復(fù)雜數(shù)據(jù)結(jié)構(gòu)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python多維列表總是只轉(zhuǎn)為一維數(shù)組問(wèn)題解決
這篇文章主要為大家介紹了python多維列表總是只轉(zhuǎn)為一維數(shù)組問(wèn)題解決實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Python程序中引用環(huán)境變量的方法實(shí)現(xiàn)
本文主要介紹了Python程序中引用環(huán)境變量的方法實(shí)現(xiàn),通過(guò)配置環(huán)境變量并在代碼中引用,可以避免將敏感信息直接寫(xiě)入代碼中,感興趣的可以了解一下2024-12-12
Python中PDF轉(zhuǎn)Word的多種實(shí)現(xiàn)方法
在日常辦公和數(shù)據(jù)處理中,經(jīng)常需要將PDF文檔轉(zhuǎn)換為Word文檔,以便進(jìn)行編輯、修改或格式調(diào)整,Python作為一種強(qiáng)大的編程語(yǔ)言,提供了多種庫(kù)和工具來(lái)實(shí)現(xiàn)這一功能,以下是對(duì)Python中PDF轉(zhuǎn)Word技術(shù)的詳細(xì)介紹,需要的朋友可以參考下2025-01-01
python使用Selenium和cookie繞過(guò)驗(yàn)證碼實(shí)現(xiàn)登錄示例代碼
文章介紹了如何使用Selenium獲取登錄過(guò)程中的cookie信息,并通過(guò)抓包工具獲取cookie,通過(guò)示例展示了如何在Dsmall和CRM系統(tǒng)中實(shí)現(xiàn)免登陸操作,總結(jié)了兩種方法:一種是在獲取到cookie后直接添加到當(dāng)前會(huì)話中,另一種是將cookie存儲(chǔ)到本地文件并在后續(xù)請(qǐng)求中使用2025-01-01
Python實(shí)戰(zhàn)基礎(chǔ)之Pandas統(tǒng)計(jì)某個(gè)數(shù)據(jù)列的空值個(gè)數(shù)
我們?cè)谔幚頂?shù)據(jù)的時(shí)候,經(jīng)常需要檢查數(shù)據(jù)的質(zhì)量,也需要知道出問(wèn)題的數(shù)據(jù)在哪個(gè)位置,下面這篇文章主要給大家介紹了關(guān)于Python實(shí)戰(zhàn)基礎(chǔ)之利用Pandas統(tǒng)計(jì)某個(gè)數(shù)據(jù)列空值個(gè)數(shù)的相關(guān)資料,需要的朋友可以參考下2022-08-08
Python逐行讀取文件中內(nèi)容的簡(jiǎn)單方法
今天小編就為大家分享一篇關(guān)于Python逐行讀取文件中內(nèi)容的簡(jiǎn)單方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02

