網(wǎng)站建設(shè)基礎(chǔ)策劃書做游戲推廣怎么找客戶

在 Python 中,如果想要操作文件,首先需要?jiǎng)?chuàng)建或者打開指定的文件,并創(chuàng)建一個(gè)文件對(duì)象,而這些工作可以通過內(nèi)置的 open() 函數(shù)實(shí)現(xiàn)。
open() 函數(shù)用于創(chuàng)建或打開指定文件,該函數(shù)的常用語法格式如下:
file = open(file_name [, mode='r' [ , buffering=-1 [ , encoding = None ]]])
此格式中,用 [] 括起來的部分為可選參數(shù),即可以使用也可以省略。其中,各個(gè)參數(shù)所代表的含義如下:
file:表示要?jiǎng)?chuàng)建的文件對(duì)象。
file_name:要?jiǎng)?chuàng)建或打開文件的文件名稱,該名稱要用引號(hào)(單引號(hào)或雙引號(hào)都可以)括起來。需要注意的是,如果要打開的文件和當(dāng)前執(zhí)行的代碼文件位于同一目錄,則直接寫文件名即可;否則,此參數(shù)需要指定打開文件所在的完整路徑。
mode:可選參數(shù),用于指定文件的打開模式??蛇x的打開模式如表 1 所示。如果不寫,則默認(rèn)以只讀(r)模式打開文件。
buffering:可選參數(shù),用于指定對(duì)文件做讀寫操作時(shí),是否使用緩沖區(qū)(本節(jié)后續(xù)會(huì)詳細(xì)介紹)。
encoding:手動(dòng)設(shè)定打開文件時(shí)所使用的編碼格式,不同平臺(tái)的 ecoding 參數(shù)值也不同,以 Windows 為例,其默認(rèn)為 cp936(實(shí)際上就是 GBK 編碼)。
open() 函數(shù)支持的文件打開模式如表 1 所示。
表 1 open 函數(shù)支持的文件打開模式
模式 | 意義 | 注意事項(xiàng) |
r | 只讀模式打開文件,讀文件內(nèi)容的指針會(huì)放在文件的開頭。 | 操作的文件必須存在。 |
rb | 以二進(jìn)制格式、采用只讀模式打開文件,讀文件內(nèi)容的指針位于文件的開頭,一般用于非文本文件,如圖片文件、音頻文件等。 | |
r+ | 打開文件后,既可以從頭讀取文件內(nèi)容,也可以從開頭向文件中寫入新的內(nèi)容,寫入的新內(nèi)容會(huì)覆蓋文件中等長(zhǎng)度的原有內(nèi)容。 | |
rb+ | 以二進(jìn)制格式、采用讀寫模式打開文件,讀寫文件的指針會(huì)放在文件的開頭,通常針對(duì)非文本文件(如音頻文件)。 | |
w | 以只寫模式打開文件,若該文件存在,打開時(shí)會(huì)清空文件中原有的內(nèi)容。 | 若文件存在,會(huì)清空其原有內(nèi)容(覆蓋文件);反之,則創(chuàng)建新文件。 |
wb | 以二進(jìn)制格式、只寫模式打開文件,一般用于非文本文件(如音頻文件) | |
w+ | 打開文件后,會(huì)對(duì)原有內(nèi)容進(jìn)行清空,并對(duì)該文件有讀寫權(quán)限。 | |
wb+ | 以二進(jìn)制格式、讀寫模式打開文件,一般用于非文本文件 | |
a | 以追加模式打開一個(gè)文件,對(duì)文件只有寫入權(quán)限,如果文件已經(jīng)存在,文件指針將放在文件的末尾(即新寫入內(nèi)容會(huì)位于已有內(nèi)容之后);反之,則會(huì)創(chuàng)建新文件。 | |
ab | 以二進(jìn)制格式打開文件,并采用追加模式,對(duì)文件只有寫權(quán)限。如果該文件已存在,文件指針位于文件末尾(新寫入文件會(huì)位于已有內(nèi)容之后);反之,則創(chuàng)建新文件。 | |
a+ | 以讀寫模式打開文件;如果文件存在,文件指針放在文件的末尾(新寫入文件會(huì)位于已有內(nèi)容之后);反之,則創(chuàng)建新文件。 | |
ab+ | 以二進(jìn)制模式打開文件,并采用追加模式,對(duì)文件具有讀寫權(quán)限,如果文件存在,則文件指針位于文件的末尾(新寫入文件會(huì)位于已有內(nèi)容之后);反之,則創(chuàng)建新文件。 |
文件打開模式,直接決定了后續(xù)可以對(duì)文件做哪些操作。例如,使用 r 模式打開的文件,后續(xù)編寫的代碼只能讀取文件,而無法修改文件內(nèi)容。
圖 2 中,將以上幾個(gè)容易混淆的文件打開模式的功能做了很好的對(duì)比:

圖 2 不同文件打開模式的功能
【例 1】默認(rèn)打開 "a.txt" 文件。
#當(dāng)前程序文件同目錄下沒有 a.txt 文件
file =open("a.txt")
print(file)
當(dāng)以默認(rèn)模式打開文件時(shí),默認(rèn)使用 r 權(quán)限,由于該權(quán)限要求打開的文件必須存在,因此運(yùn)行此代碼會(huì)報(bào)如下錯(cuò)誤:
Traceback (most recent call last):
File "C:\Users\mengma\Desktop\demo.py", line 1, in <module>
file = open("a.txt")
FileNotFoundError: [Errno 2] No such file or directory: 'a.txt'
現(xiàn)在,在程序文件同目錄下,手動(dòng)創(chuàng)建一個(gè) a.txt 文件,并再次運(yùn)行該程序,其運(yùn)行結(jié)果為:
<_io.TextIOWrapper name='a.txt' mode='r' encoding='cp936'>
可以看到,當(dāng)前輸出結(jié)果中,輸出了 file 文件對(duì)象的相關(guān)信息,包括打開文件的名稱、打開模式、打開文件時(shí)所使用的編碼格式。
使用 open() 打開文件時(shí),默認(rèn)采用 GBK 編碼。但當(dāng)要打開的文件不是 GBK 編碼格式時(shí),可以在使用 open() 函數(shù)時(shí),手動(dòng)指定打開文件的編碼格式,例如:
file = open("a.txt",encoding="utf-8")
注意,手動(dòng)修改 encoding 參數(shù)的值,僅限于文件以文本的形式打開,也就是說,以二進(jìn)制格式打開時(shí),不能對(duì) encoding 參數(shù)的值做任何修改,否則程序會(huì)拋出 ValueError 異常,如下所示:
ValueError: binary mode doesn't take an encoding argument
open()是否需要緩沖區(qū)
通常情況下、建議大家在使用 open() 函數(shù)時(shí)打開緩沖區(qū),即不需要修改 buffing 參數(shù)的值。
如果 buffing 參數(shù)的值為 0(或者 False),則表示在打開指定文件時(shí)不使用緩沖區(qū);如果 buffing 參數(shù)值為大于 1 的整數(shù),該整數(shù)用于指定緩沖區(qū)的大小(單位是字節(jié));如果 buffing 參數(shù)的值為負(fù)數(shù),則代表使用默認(rèn)的緩沖區(qū)大小。
為什么呢?原因很簡(jiǎn)單,目前為止計(jì)算機(jī)內(nèi)存的 I/O 速度仍遠(yuǎn)遠(yuǎn)高于計(jì)算機(jī)外設(shè)(例如鍵盤、鼠標(biāo)、硬盤等)的 I/O 速度,如果不使用緩沖區(qū),則程序在執(zhí)行 I/O 操作時(shí),內(nèi)存和外設(shè)就必須進(jìn)行同步讀寫操作,也就是說,內(nèi)存必須等待外設(shè)輸入(輸出)一個(gè)字節(jié)之后,才能再次輸出(輸入)一個(gè)字節(jié)。這意味著,內(nèi)存中的程序大部分時(shí)間都處于等待狀態(tài)。
而如果使用緩沖區(qū),則程序在執(zhí)行輸出操作時(shí),會(huì)先將所有數(shù)據(jù)都輸出到緩沖區(qū)中,然后繼續(xù)執(zhí)行其它操作,緩沖區(qū)中的數(shù)據(jù)會(huì)有外設(shè)自行讀取處理;同樣,當(dāng)程序執(zhí)行輸入操作時(shí),會(huì)先等外設(shè)將數(shù)據(jù)讀入緩沖區(qū)中,無需同外設(shè)做同步讀寫操作。
open()文件對(duì)象常用的屬性
成功打開文件之后,可以調(diào)用文件對(duì)象本身擁有的屬性獲取當(dāng)前文件的部分信息,其常見的屬性為:
file.name:返回文件的名稱;
file.mode:返回打開文件時(shí),采用的文件打開模式;
file.encoding:返回打開文件時(shí)使用的編碼格式;
file.closed:判斷文件是否己經(jīng)關(guān)閉。
舉個(gè)例子:
# 以默認(rèn)方式打開文件
f =open('my_file.txt')# 輸出文件是否已經(jīng)關(guān)閉
print(f.closed)# 輸出訪問模式
print(f.mode)#輸出編碼格式
print(f.encoding)# 輸出文件名
print(f.name)
程序執(zhí)行結(jié)果為:
False
r
cp936
my_file.txt
注意,使用 open() 函數(shù)打開的文件對(duì)象,必須手動(dòng)進(jìn)行關(guān)閉(后續(xù)章節(jié)會(huì)詳細(xì)講解),Python 垃圾回收機(jī)制無法自動(dòng)回收打開文件所占用的資源。