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


讀寫文件背景

讀寫文件是最常見的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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM