讀寫文件是最多見的IO操做。Python內置了讀寫文件的函數,用法和C是兼容的。python
在磁盤上讀寫文件的功能都是由操做系統提供的,現代操做系統不容許普通的程序直接操做磁盤。緩存
讀寫文件就是請求操做系統打開一個文件對象(一般稱爲文件描述符),而後,經過操做系統提供的接口從這個文件對象中讀取數據(讀文件),或者把數據寫入這個文件對象(寫文件)。函數
要以讀文件的模式打開一個文件對象,使用Python內置的 open() 函數,傳入文件名和標示符:編碼
f = open('/Users/michael/test.txt', mode='r') spa
標示符 'r' 表示只讀,這樣,咱們就成功地打開了一個文件。操作系統
若是文件不存在, open() 函數就會拋出一個 IOError 的錯誤,而且給出錯誤碼和詳細的信息告訴你文件不存在:code
>>> f=open('/Users/michael/notfound.txt', 'r') Traceback (most recent call last): File "<stdin>", line 1, in <module> FileNotFoundError: [Errno 2] No such file or directory: '/Users/michael/notfound.txt'
模式對象 |
可作操做blog |
若文件不存在接口 |
是否覆蓋 |
r |
只讀 |
error |
- |
r+ |
讀寫 |
error |
T |
w |
只寫 |
create |
T |
w+ |
讀寫 |
create |
T |
a |
只寫 |
create |
F,尾部追加寫 |
a+ |
讀寫 |
create |
F,尾部追加寫 |
wb |
只寫二進制字符串,寫入bytes |
create |
T |
rb |
只讀二進制字符串,返回bytes |
error |
- |
若是文件打開成功,接下來,調用 read() 方法能夠一次讀取文件的所有內容,Python把內容讀到內存,用一個str對象表示:
>>> f.read() 'Hello, world!'
最後一步是調用 close() 方法關閉文件。文件使用完畢後必須關閉,由於文件對象會佔用操做系統的資源,而且操做系統同一時間能打開的文件數量也是有限的:
>>> f.close()
關於read()、readline()、readlines()的區別可看這篇博文:
因爲文件讀寫時都有可能產生 IOError ,一旦出錯,後面的 f.close() 就不會調用。因此,爲了保證不管是否出錯都能正確地關閉文件,咱們可使用 try ... finally 來實現:
try: f = open('/path/to/file', 'r') print(f.read()) finally: if f: f.close()
但由於每次這樣寫太繁瑣了,因此Python引入了 with open() 來自動調用close()方法,不管是否出錯
一、open須要主動調用close(),with不須要
二、open讀取文件時發生異常,沒有任何處理,with有很好的處理上下文產生的異常
with open("test/test.py", 'r') as f1, open("test/test2.py", 'r') as f2: print(f1.read()) print(f2.read())
寫文件和讀文件是同樣的,惟一區別是調用 open() 函數時,須要將 mode 參數改爲可寫的模式,如上面的表格所示
f = open("test/test.py", "a+") f.write("test") f.writelines("polo") print(f.read()) f.close()
你能夠反覆調用 write() 來寫入文件,可是務必要調用 f.close() 來關閉文件。
當咱們寫文件時,操做系統每每不會馬上把數據寫入磁盤,而是放到內存緩存起來,空閒的時候再慢慢寫入。
只有調用 close() 方法時,操做系統才保證把沒有寫入的數據所有寫入磁盤。忘記調用close()
的後果是數據可能只寫了一部分到磁盤,剩下的丟失了。
因此,仍是用with語句好鴨!
with open("test/test.py", "a+") as f: f.write("test")
要寫入特定編碼的文本文件,請給 open() 函數傳入 encoding 參數,將字符串自動轉換成指定編碼,默認 encoding=None
例如,讀取utf-8編碼的文件:
f = open('test/utf8.txt', 'r', encoding='utf-8') print(f.read())
遇到有些編碼不規範的文件,你可能會遇到 UnicodeDecodeError ,由於在文本文件中可能夾雜了一些非法編碼的字符。
遇到這種狀況, open() 函數還接收一個 errors 參數,默認是 errors=None 表示若是遇到編碼錯誤後如何處理。最簡單的方式是直接忽略
f = open('test/utf8.txt', 'r', encoding='utf-8', errors='ignore')
劃重點!!!牆裂建議使用with open()
劃重點!!!牆裂建議使用with open()
劃重點!!!牆裂建議使用with open()
os.open(file, flags[, mode])
#!/usr/bin/python # -*- coding: UTF-8 -*- import os, sys # 打開文件 fd = os.open( "foo.txt", os.O_RDWR|os.O_CREAT ) # 寫入字符串 os.write(fd, "This is test") # 關閉文件 os.close( fd )
劃重點!!!不建議使用os.open,仍是用with open()
劃重點!!!不建議使用os.open,仍是用with open()
劃重點!!!不建議使用os.open,仍是用with open()