io
由於cpu和記憶體的速度遠遠高於外設的速度,所以,在io程式設計中,就存在速度嚴重不匹配的問題。
如要把100m的資料寫入磁碟,cpu輸出100m的資料只需要0.01秒,可是磁碟要接收這100m資料可能需要10秒,怎麼辦呢?有兩種辦法:
第一種是cpu等著,也就是程式暫停執行後續**,等100m的資料在10秒後寫入磁碟,再接著往下執行,這種模式稱為同步io;
另一種方法是cpu不等待,只是告訴磁碟,「您慢慢寫,不著急,我接著幹別的事去了」,於是,後續**可以立刻接著執行,這種模式稱為非同步io。
同步和非同步的區別就在於是否等待io執行的結果。
檔案讀寫
讀檔案
以讀檔案的模式開啟乙個檔案物件,python內建的open()函式,傳入檔名和標示符
>>> f = open('/users/michael/test.txt', 'r')
標示符'r'表示讀
如果檔案不存在,open()函式就會丟擲乙個ioerror的錯誤
如果檔案開啟成功,呼叫read()方法可以一次讀取檔案的全部內容
>>> f.read()
'hello, world!'#python把內容讀到記憶體,用乙個str物件表示
close()方法關閉檔案
>>> f.close()
呼叫read(size)方法,每次最多讀取size個位元組的內容。
呼叫readline()可以每次讀取一行內容,
呼叫readlines()一次讀取所有內容並按行返回list。
為了保證無論是否出錯都能正確地關閉檔案,我們可以使用try ... finally來實現:
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
簡化:
with open('/path/to/file', 'r') as f:
print(f.read())
這和前面的try ... finally是一樣的,但是**更佳簡潔,並且不必呼叫f.close()方法。
二進位制檔案
b'\xff\xd8\xff\xe1\x00\x18exif\x00\x00...' # 十六進製制表示的位元組
要讀取非utf-8編碼的文字檔案,需要給open()函式傳入encoding引數,例如,讀取gbk編碼的檔案:
>>> f = open('/users/michael/gbk.txt', 'r', encoding='gbk')
>>> f.read()
'測試'
遇到有些編碼不規範的檔案,pen()函式還接收乙個errors引數
>>> f = open('/users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
寫檔案
>>> f = open('/users/michael/test.txt', 'w')
>>> f.write('hello, world!')
防止丟失使用with語句
with語句
with open('/users/michael/test.txt', 'w') as f:
f.write('hello, world!')
追加到檔案末尾
python IO程式設計,檔案讀寫
函式 open name mode buffering 引數 返回 乙個檔案物件 例項 mode引數 r 唯讀。w 寫,原內容被替換。a 在原內容後追加內容。buffering引數 無緩衝,直接將資料寫到硬碟上。有緩衝,資料先寫到記憶體裡,只有使用flush函式或者close函式才會將資料更新到硬碟...
Python io流的讀寫操作
自擬需求 將一段對話解析出來,並規範命名格式為 人名 序號 如下 在完善這個功能之前遇到兩個錯誤 1.unicodedecodeerror gbk codec can t decode byte 0xab in position 8 illegal multibyte sequence 這個是由於檔...
Python io 讀取檔案
python io 讀取檔案 1.open 使用open開啟檔案後一定要記得呼叫檔案物件的close 方法。比如可以用try finally語句來確保最後能關閉檔案。file object open thefile.txt try all the text file object.read fina...