Python - with open()、os.open()、open()的詳細使用

讀寫文件背景

讀寫文件是最多見的IO操做。Python內置了讀寫文件的函數,用法和C是兼容的。python

在磁盤上讀寫文件的功能都是由操做系統提供的,現代操做系統不容許普通的程序直接操做磁盤緩存

讀寫文件就是請求操做系統打開一個文件對象(一般稱爲文件描述符),而後,經過操做系統提供的接口從這個文件對象中讀取數據(讀文件),或者把數據寫入這個文件對象(寫文件)。函數

 

open()、with open()

打開文件

要以讀文件的模式打開一個文件對象,使用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'

mode的各類模式

模式對象

可作操做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() 與 with open()   區別

一、open須要主動調用close(),with不須要

二、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()

相關文章
相關標籤/搜索