前言
在編程語言中,文件讀寫是最常見的IO操作,Python/ target=_blank class=infotextkey>Python內置了讀寫文件的函數,其中包括open()函數、os.open()函數以及with open()語句。本文將詳細介紹這三種方法的使用方式、區別和最佳實踐。
open()
open()函數是Python內置的用于打開文件的函數,它接受一個文件路徑和打開模式作為參數,并返回一個文件對象。下面是一個示例:
file = open("example.txt", "r")
上述代碼中,我們使用open()函數打開了一個名為"example.txt"的文件,并以只讀模式(“r”)打開。常用的打開模式如下:
模式可做操作若文件不存在是否覆蓋r只讀error-r+讀寫errorTw只寫createTw+讀寫createTa只寫createF,尾部追加寫a+讀寫createF,尾部追加寫wb只寫二進制字符串,寫入bytescreateTrb只讀二進制字符串,返回byteserror-
使用示例
- 打開文件
要以讀文件的模式打開一個文件對象,使用Python內置的 open() 函數,傳入文件名和標示符:
f=open('test.txt', 'r')
當文件存在時,腳本會正常運行,當文件不存在或者路徑錯誤時,會拋出IOError錯誤,如下:
Traceback (most recent call last):
File "C:/Users/xxxx/PycharmProjects/xxxx/read_demo.py", line xxxx, in <module>
f=open('text.txt', 'r')
FileNotFoundError: [Errno 2] No such file or directory: 'text.txt'
- 讀取文件
如果文件打開成功,接下來,調用 read() 方法可以一次讀取文件的全部內容,Python把內容讀到內存,用一個str對象表示:
f=open('test.txt', 'r')
print(f.read())
注:如果文件本身編碼為gbk,讀取時將會出現報錯,如下:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xbd in position 30: illegal multibyte sequence
我們需要將文件編碼格式改為utf-8,增加一個encoding='utf-8'的參數,如下:
f=open('test.txt', 'r', encoding='utf-8')
print(f.read())
----------------
輸出結果如下:
2014年巴西世界杯,德國7:0巴西
- 關閉文件
使用open()函數打開文件后必須要關閉,否則將會一直占用系統資源,并且同時打開的文件數量是有限的,需要我們及時關閉,代碼如下:
f.close()
os.open()
os.open()函數是Python的os模塊提供的函數,用于以低級別的方式打開文件。它接受文件路徑和打開模式作為參數,并返回一個文件描述符。下面是一個語法示例:
os.open(file, flags[, mode])
參數說明:
- file:要打開的文件
- flags:該參數可以是以下選項,多個使用 “|” 隔開,只列常用的:
- os.O_RDONLY: 以只讀的方式打開
- os.O_WRONLY: 以只寫的方式打開
- os.O_RDWR : 以讀寫的方式打開
- os.O_AppEND: 以追加的方式打開
- os.O_CREAT: 創建并打開一個新文件
使用示例:
import os
f = os.open('os_test.txt', os.O_RDWR|os.O_CREAT)
str = '拜仁永遠是第一!'
s = bytes(str, encoding='utf-8')
os.write(f, s)
os.close(f)
注:如果直接寫入字符串會報錯,報錯為a bytes-like object is required, not 'str',我們需要提前將字符串轉為bytes才可以成功寫入文件。
與open()類似,os.open()也需要close()掉,釋放系統資源。
with open()
with open()語句是一種更加簡潔和安全的文件操作方式。它會在文件使用完畢后自動關閉文件,無需顯式調用close()函數。下面是語法示例:
with open(file, 'mode') as f:
with open()語句的各種模式與open()語句一樣,這里不做贅述。
使用示例
with open('test.txt', 'r', encoding='utf-8')as f:
print(f.read())
#################
2014年巴西世界杯,德國7:0巴西
-------------------------------
# 同時打開多個文件
with open('test.txt', 'r', encoding='utf-8')as f1, open('os_test.txt', 'r', encoding='utf-8')as f2:
print(f1.read())
print(f2.read())
################
2014年巴西世界杯,德國7:0巴西
拜仁永遠是第一!
注:為了避免文件打開時出現UnicodeDecodeError建議在打開文件時,加上encoding='utf-8'參數。
異同點與最優選擇
open()函數與os.open()函數不會自動關閉文件,需要調用close方法,這一點是with open()的大優勢,不會造成資源泄漏的問題。
- 使用open()函數和with open()語句是進行文件操作的常見做法,尤其是對于簡單的文件讀寫任務。
- 需要以低級別方式操作文件時,才使用os.open()函數,它更適用于特定的場景,如需要在文件中定位和讀取特定位置的數據。
- 在使用with open()語句時,可以在語句塊中進行其他的文件操作,例如寫入內容或定位文件指針位置。
綜合來說,執行文件操作時,最優選擇毫無疑問是with open(),建議執行文件操作時使用’with open()'語句!!!
總結
綜上所述,我們詳細介紹了Python中文件操作的三種方式:open()函數、os.open()函數和with open()語句。根據不同方式的優缺點,我們還是推薦使用最優秀的with open()語句來執行文件的操作。