讀寫文件是最多見的IO操做。python
在磁盤上讀寫文件的功能都是由操做系統提供的,讀寫文件就是請求操做系統打開一個文件對象(一般稱之爲文件描述符),而後,經過操做系統提供的接口從這個文件對象中讀取數據(讀文件),或者把數據寫入這個文件對象(寫文件)。windows
讀文件:緩存
read([size]):讀取文件(讀取size字節,默認讀取所有) readline([size]):讀取一行 readlines([size]) :讀取緩衝buf(io.DEFAULT_SET_BUFFER),返回每一行所組成的列表 iter:使用迭代器遍歷讀取文件 f.open(name);iter_f = iter(f);用for line in iter_f循環迭代器
要以讀文件的模式打開一個文件對象,使用Python內置的open()函數,傳人文件名和標識符。函數
>>> f = open('/opt/test.txt','r')
標識符'r'表示讀,若是文件不存在,open()函數就會拋出一個FileNotFoundError的錯誤,並提示文件不存在。測試
>>> f = open('test.txt','r') Traceback (most recent call last): File "D:/Users/練習.py", line 305, in <module> f = open('test.txt','r') FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'
文件打開成功,則調用read()方法能夠一次讀取文件的所有內容,Python把內容讀到內存,用str對象表示:close()方法關閉文件。文件使用完必須關閉,由於文件對象會佔用操做系統的資源,而且操做系統同一時間能打開的文件數量是有限的。編碼
f = open('test.txt','r') print(f.read()) f.close() hello world
使用with語句能夠來自動幫咱們調用close()方法。操作系統
with open('test.txt','r') as f: print(f.read()) hello world
調用read()會一次性讀取文件的所有內容,若是文件過大,內存就爆了,因此,保險起見,能夠反覆調用read(size)方法,每次最多讀取size個字節的內容。另外,readline()能夠每次讀取一行的內容,調用readlines()一次讀取全部內容並按行返回list。指針
若是文件太小,read()一次性讀取最方便,若是不能肯定文件大小,能夠反覆調用read(size)比較保險,若是是配置文件,調用readlines()最方便。code
for line in f.readlines(): print(line.strip()) # 把末尾的\n去除
二進制文件視頻
要讀取二進制文件,如圖片、視頻等,用‘rb’模式打開文件
with open('test.txt','rb') as f: print(f.read()) b'hello world\r\n\xe5\x88\xa4'
字符編碼
windows下默認編碼是gbk模式,要讀取utf-8編碼的文本文件,須要給open()函數傳人encoding參數
with open('test.txt','r',encoding='utf8') as f: print(f.read()) hello world 判斷下列
遇到編碼不規範的文件,可能會碰到UnicodeDecodeError,這是因爲文本文件中可能夾雜了一些非法編碼的字符,open()函數還接收了一個errors參數,表示若是遇到編碼錯誤後如何處理,最簡單的方式就是直接忽略。
with open('test.txt','r',encoding='utf8',errors='ingore') as f: print(f.read())
寫文件:
write(str):將字符串寫入文件 writelines(sequence_of_strings):寫多行到文件,參數爲可迭代的對象
flush() 將存放再內存中的內容寫入硬盤。
當調用write()時,Python解釋器調用系統想把內容寫到磁盤,但Linux內核有文件緩衝機制,因此會緩存到內核的緩存區,當調用close()或者flush()時纔會把內容寫到文件。或者寫入數據量大於或等於寫緩存,寫緩存也會同步到磁盤上。
寫文件和讀文件同樣,都是調用open()函數,惟一區別就是標識符的傳人,'w',或者'wb'來表示寫文本文件或者寫二進制文件。
with open('t.txt','w') as f_w: f_w.write('hello world')
寫入文件如不存在時,會直接建立該文件並進行寫入操做。若是文件裏面又內容時,會覆蓋掉原有的文件。
追加文件內容則能夠傳入'a'參數。
文件指針的操做:
seek(offset[,whwence]) 移動文件指針 # offset 偏移量,能夠爲負數。 whenc 偏移相對位置。有三種移動方式0,1,2,其中1和2必須在b模式下進行,但不管哪一種模式,都是以bytes爲單位移動的 tell 打印指針所在位置 truncate是截斷文件,因此文件的打開方式必須可寫,可是不能用w或w+等方式打開,由於那樣直接清空文件了,因此truncate要在r+或a或a+等模式下測試效果。