讀寫文件是最多見的IO操做
Python內置了讀寫文件的函數,用法和C是兼容的
現代操做系統不容許普通的程序直接操做磁盤,即在磁盤上讀寫文件的功能都是由操做系統提供的
所以,讀寫文件就是請求操做系統打開一個文件對象(一般稱爲文件描述符),並經過操做系統提供的接口操做這個文件對象進行讀寫數據(讀寫文件)緩存
使用示例:網絡
讀文件函數
f = open('/Users/michael/test.txt', 'r') #Python內置的open()函數,'r'表示以read模式打開一個文件對象,當文件不存在時,函數拋出IOError錯誤 f.read() #調用read()方法可一次讀取文件所有內容,Python把內容讀到內存,用一個str對象表示 f.close() #調用close()方法關閉文件 #文件使用完畢後必須關閉,由於文件對象會佔用操做系統的資源,而且操做系統同一時間能打開的文件數量也是有限的
使用try-catch
因爲文件讀寫時都有可能產生IOError,一旦出錯,後面的f.close()就不會調用
所以,爲了保證不管是否出錯都能正確地關閉文件,可使用try ... finally來實現編碼
try: f = open('/path/to/file', 'r') print(f.read()) finally: if f: f.close()
使用with
每次都使用try catch寫太繁瑣,Python引入了with語句來自動幫咱們調用close()方法
該寫法代碼更簡潔,且沒必要調用f.close()方法spa
with open('/path/to/file', 'r') as f: print(f.read())
讀取圖片操作系統
f = open('/Users/michael/test.jpg', 'rb') #默認都是讀取文本文件,而且是UTF-8編碼的文本文件 #要讀取二進制文件,好比圖片、視頻等等,用'rb'模式打開文件便可
讀取其餘編碼文件,如中文文件code
f = open('/Users/michael/gbk.txt', 'r', encoding='gbk') #讀取GBK編碼的文件,要讀取非UTF-8編碼的文本文件,須要給open()函數傳入encoding參數 f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
#忽略文本中包含非法編碼字符返回的錯誤 #遇到有些編碼不規範的文件,可能會遇到UnicodeDecodeError,由於在文本文件中可能夾雜了一些非法編碼的字符 #遇到這種狀況,open()函數還接收一個errors參數,表示若是遇到編碼錯誤後如何處理,最簡單的方式是直接忽略
關於讀文件的幾種方式:視頻
f.read() #一次性讀取文件的所有內容,但若是文件過大,會致使內存不足
f.read(size) #每次最多讀取size個字節的內容,可避免使用f.read()時因文件過大而致使內存不足的問題
f.readline() #每次讀取文件的一行內容
f.readlines() #一次讀取全部內容並按行返回list
使用何種方式需根據狀況而定:
若是文件很小,read()一次性讀取最方便
若是不能肯定文件大小,反覆調用read(size)比較保險
若是是配置文件,調用readlines()最方便對象
關於file-like Objectblog
像open()函數返回的這種有個read()方法的對象,在Python中統稱爲file-like Object
除了file外,還能夠是內存的字節流,網絡流,自定義流等等
file-like Object不要求從特定類繼承,只要寫個read()方法就行
StringIO就是在內存中建立的file-like Object,經常使用做臨時緩衝
寫文件
寫文件與讀文件同樣,惟一區別是調用open()函數時,傳入標識符不一樣,如'w'或者'wb',分別表示寫文本文件或寫二進制文件
f = open('/Users/michael/test.txt', 'w') #寫文本 f.write('Hello, world!') #可反覆調用write()來寫入文件,但必需要用close()關閉文件 f.close()
寫入文件(二進制)
f = open('/Users/michael/test.txt', 'wb') #寫二進制 f.write(bin(100)) f.close()
使用with語句
當寫文件時,操做系統每每不會馬上把數據寫入磁盤,而是放到內存緩存起來,空閒的時候再慢慢寫入
只有調用close()方法時,操做系統才保證把沒有寫入的數據所有寫入磁盤
若是忘記調用close(),則數據可能只寫了一部分到磁盤,剩下的丟失了,所以用with語句最保險
with open('/Users/michael/test.txt', 'w') as f: f.write('Hello, world!')
寫入文件(其餘編碼)
with open('/Users/michael/test.txt', 'w',encoding='GBK') as f: #要寫入特定編碼(非UTF-8)的文本文件,需傳入encoding參數,將字符串自動轉換成指定編碼 f.write('中國')
寫入文件(覆蓋)
with open('/Users/michael/test.txt', 'w') as f: #以'w'模式寫入文件時,若是文件已存在,會直接覆蓋,至關於刪掉後新寫入一個文件 f.write('Hello, world!')
寫入文件(追加)
with open('/Users/michael/test.txt', 'a') as f: #以'a'模式寫入文件時,會直接在已存在文件結尾追加 f.write('Hello, world!')