讀寫文件背景
讀寫文件是最常見的IO操作。Python內置了讀寫文件的函數,用法和C是兼容的。
在磁盤上讀寫文件的功能都是由操作系統提供的,現代操作系統不允許普通的程序直接操作磁盤。
讀寫文件就是請求操作系統打開一個文件對象(通常稱為文件描述符),然后,通過操作系統提供的接口從這個文件對象中讀取數據(讀文件),或者把數據寫入這個文件對象(寫文件)。
open()、with open()
打開文件
要以讀文件的模式打開一個文件對象,使用Python內置的 open() 函數,傳入文件名和標示符:
f = open('/Users/michael/test.txt', mode='r')
標示符 'r' 表示只讀,這樣,我們就成功地打開了一個文件。
如果文件不存在, open() 函數就會拋出一個 IOError 的錯誤,並且給出錯誤碼和詳細的信息告訴你文件不存在:
>>> 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'
mode的各種模式
模式 |
可做操作 |
若文件不存在 |
是否覆蓋 |
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()的區別可看這篇博文:
https://www.cnblogs.com/poloyy/p/12350736.html
關閉文件
由於文件讀寫時都有可能產生 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() 與 with open() 區別
1、open需要主動調用close(),with不需要
2、open讀取文件時發生異常,沒有任何處理,with有很好的處理上下文產生的異常
用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()
格式
os.open(file, flags[, mode])
參數
- file:要打開的文件
- flags:該參數可以是以下選項,多個使用 "|" 隔開,只列常用的:
- os.O_RDONLY: 以只讀的方式打開
- os.O_WRONLY: 以只寫的方式打開
- os.O_RDWR : 以讀寫的方式打開
- os.O_APPEND: 以追加的方式打開
- os.O_CREAT: 創建並打開一個新文件
簡單實例
#!/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()