Python I/O與進(jìn)程的詳細(xì)講解
I/O
with語(yǔ)句
with context_expression [as target(s)]: with-body
context_expression返回值遵從上下文管理協(xié)議,包含__enter__()與__exit__()方法,as語(yǔ)句的target(s)得到的是__enter__()返回值,執(zhí)行with-body后會(huì)調(diào)用上下文管理器的__exit__()方法,使用with語(yǔ)句,可以減輕某些代碼編寫(xiě)負(fù)擔(dān),比如文件讀寫(xiě)。
讀文件
try:
f = open('/path/to/file', 'r', encoding='utf8', errors='ignore')
print(f.read(1024))
finally:
if f:
f.close()
# 使用with語(yǔ)句
with open('/path/to/file', 'r') as f:
print(f.read(1024))
open()方法打開(kāi)文件模式,默認(rèn)以u(píng)tf8格式讀取,添加后綴'b'(rb、wb)表示以二進(jìn)制方式讀取,mode有以下幾種:

StringIO和BytesIO
StringIO將string按照文件的方式讀取和寫(xiě)入,BytesIO將bytes按照文件的的方式讀取和寫(xiě)入。
OS
通過(guò)OS模塊,與操作系統(tǒng)信息交互,如創(chuàng)建、移動(dòng)、列出文件等等。
序列化
通過(guò)內(nèi)置模塊pickle,實(shí)現(xiàn)序列化與反序列化,使用json模塊完成JSON數(shù)據(jù)的序列化和反序列化。
import pickle
d = dict(name = 'sha', age = 26)
# 將序列化內(nèi)容寫(xiě)入文件
with open('dump', 'wb') as f:
pickle.dump(d, f)
# 從文件中讀取序列化內(nèi)容
with open('dump', 'rb') as f:
d = pickle.load(f)
print(d) # {'name': 'sha', 'age': 26}
進(jìn)程與線程
進(jìn)程
Python調(diào)用一次進(jìn)程fork()會(huì)有兩次返回,子進(jìn)程永遠(yuǎn)返回0,父進(jìn)程中返回子進(jìn)程ID。os.fork()不支持windows,multiprocessing模塊是跨平臺(tái)版本的多進(jìn)程模塊。
import os
pid = os.fork() # pid后的代碼會(huì)在兩個(gè)進(jìn)程中分別執(zhí)行,通過(guò)pid值不同判斷父子
if pid == 0:
print('exec in child process')
else:
print('exec in parent process')
# exec in parent process
# exec in child process
進(jìn)程池
from multiprocessing import Pool
def say(x):
print(x)
if __name__ == '__main__':
p = Pool(4)
for i in range(5):
p.apply_async(say, args=(i,))
p.close()
p.join()
子進(jìn)程
import subprocess
print('$ nslookup amsimple.com')
r = subprocess.call(['nslookup', 'amsimple.com'])
print('Exit code:', r)
進(jìn)程間通信
進(jìn)程間通信通過(guò)Queue與Pipes實(shí)現(xiàn),父進(jìn)程創(chuàng)建Queue傳遞給子進(jìn)程。
線程
Python提供兩個(gè)模塊_thread與threading,前者是低級(jí)模塊后者是高級(jí)模塊,對(duì)_thread進(jìn)行了封裝。
啟動(dòng)一個(gè)線程就是把一個(gè)函數(shù)傳入并創(chuàng)建Thread實(shí)例,然后調(diào)用start()開(kāi)始執(zhí)行:
import threading
# 新線程執(zhí)行的代碼:
def say():
print('%s say hello' % threading.current_thread().name)
t = threading.Thread(target=say, name = 'SayThread')
t.start()
t.join()
threading.current_thread()返回但前運(yùn)行線程的實(shí)例,主線程名MainTreed,子線程名在創(chuàng)建時(shí)指定。
通過(guò)threading.Lock()獲取鎖,某些需要線程安全的操作,先通過(guò)acquire()獲取鎖,通過(guò)release()釋放鎖。
Python中的線程因?yàn)镚IL鎖,無(wú)法真正利用多核。
通過(guò)ThreadLocal實(shí)現(xiàn)線程級(jí)的全局變量,不同線程間相互不影響。
import threading th_local = threading.local() # th_local會(huì)跟線程綁定,不同線程看到的是不同對(duì)象
分布式進(jìn)程
managers模塊依靠網(wǎng)絡(luò)通信,可以把多進(jìn)程分布到多臺(tái)機(jī)器上。
正則
通過(guò)'r'前綴定義正則字符串,通過(guò)re模塊做正則匹配等操作。
import re s = r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$' re.match(s, 'shasharoman@gmail.com')
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
python openpyxl提取Excel圖片實(shí)現(xiàn)原理技巧
在這篇文章中,將介紹如何使用openpyxl來(lái)提取Excel中的圖片,以及它的原理和技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
linux中使用Python對(duì)圖片進(jìn)行批量命名
大家好,本篇文章主要講的是linux中使用Python對(duì)圖片進(jìn)行批量命名,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
python+selenium+autoit實(shí)現(xiàn)文件上傳功能
這篇文章主要介紹了python+selenium+autoit實(shí)現(xiàn)文件上傳功能,需要的朋友可以參考下2017-08-08
mac系統(tǒng)裝python后pip命令不能用的解決方案
這篇文章主要介紹了mac系統(tǒng)裝python后pip命令不能用的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Python+Qt身體特征識(shí)別人數(shù)統(tǒng)計(jì)源碼窗體程序(使用步驟)
這篇文章主要介紹了Python+Qt身體特征識(shí)別人數(shù)統(tǒng)計(jì)源碼窗體程序(使用步驟),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
python使用numpy計(jì)算兩個(gè)框的iou方法示例
這篇文章主要介紹了python使用numpy計(jì)算兩個(gè)框的iou方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
各個(gè)系統(tǒng)下的Python解釋器相關(guān)安裝方法
這篇文章主要介紹了各個(gè)系統(tǒng)下的Python解釋器相關(guān)安裝方法,Python在很多Linux發(fā)行版中已經(jīng)被默認(rèn)安裝,需要的朋友可以參考下2015-10-10

