通過(guò)實(shí)例解析Python文件操作實(shí)現(xiàn)步驟
當(dāng)程序運(yùn)行時(shí),變量是保存數(shù)據(jù)的好方法,但變量、序列以及對(duì)象中存儲(chǔ)的數(shù)據(jù)是暫時(shí)的,程序結(jié)束后就會(huì)丟失,如果希望程序結(jié)束后數(shù)據(jù)仍然保持,就需要將數(shù)據(jù)保存到文件中。
Python 提供了內(nèi)置的文件對(duì)象,以及對(duì)文件、目錄進(jìn)行操作的內(nèi)置模塊,通過(guò)這些技術(shù)可以很方便地將數(shù)據(jù)保存到文件(如文本文件等)中。
一、文件的概念
在計(jì)算機(jī)中,文件是以二進(jìn)制的方式保存在磁盤(pán)上的。
文件分為文本文件和二進(jìn)制文件。
1、文本文件
可以使用文本編輯軟件查看,本質(zhì)上還是二進(jìn)制文件,例如:python 的源程序。
2、二進(jìn)制文件
保存的內(nèi)容不是給人直接閱讀的,而是提供給其他軟件使用的。例如:圖片文件、音頻文件、視頻文件等等,二進(jìn)制文件不能使用文本編輯軟件查看。
Python 中,對(duì)文件的操作有很多種,常見(jiàn)的操作包括創(chuàng)建、刪除、修改權(quán)限、讀取、寫(xiě)入等,這些操作可大致分為以下 2 類:
刪除、修改權(quán)限:作用于文件本身,屬于系統(tǒng)級(jí)操作。
寫(xiě)入、讀?。菏俏募畛S玫牟僮鳎饔糜谖募膬?nèi)容,屬于應(yīng)用級(jí)操作。
二、文件的基本操作
1、操作文件的步驟
文件的應(yīng)用級(jí)操作可以分為以下 3 步,每一步都需要借助對(duì)應(yīng)的函數(shù)實(shí)現(xiàn):
打開(kāi)文件:使用 open() 函數(shù),該函數(shù)會(huì)返回一個(gè)文件對(duì)象;
對(duì)已打開(kāi)文件做讀/寫(xiě)操作:讀取文件內(nèi)容可使用 read()、readline() 以及 readlines() 函數(shù);向文件中寫(xiě)入內(nèi)容,可以使用 write() 函數(shù)。
關(guān)閉文件:完成對(duì)文件的讀/寫(xiě)操作之后,最后需要關(guān)閉文件,可以使用 close() 函數(shù)。
2、打開(kāi)文件的方式
在 Python 中,如果想要操作文件,首先需要?jiǎng)?chuàng)建或者打開(kāi)指定的文件,并創(chuàng)建一個(gè)文件對(duì)象,而這些工作可以通過(guò)內(nèi)置的 open() 函數(shù)實(shí)現(xiàn)。
語(yǔ)法如下:
- file = open(file_name [, mode='r' [ , buffering=-1 [ , encoding = None ]]])
- file:表示要?jiǎng)?chuàng)建的文件對(duì)象。
- file_name:要?jiǎng)?chuàng)建或打開(kāi)文件的文件名稱。
- mode:用于指定文件的打開(kāi)模式。默認(rèn)以只讀(r)模式打開(kāi)文件。
- buffering:用于指定對(duì)文件做讀寫(xiě)操作時(shí),是否使用緩沖區(qū)。
- encoding:手動(dòng)設(shè)定打開(kāi)文件時(shí)所使用的編碼格式,不同平臺(tái)的 ecoding 參數(shù)值也不同,以 Windows 為例,其默認(rèn)為 cp936(實(shí)際上就是 GBK 編碼)。
打開(kāi)文件的常用模式
模式 | 說(shuō)明 |
---|---|
r | 以只讀方式打開(kāi)文件。文件的指針將會(huì)放在文件的開(kāi)頭,這是默認(rèn)模式。如果文件不存在,拋出異常 |
w | 以只寫(xiě)方式打開(kāi)文件。如果文件存在會(huì)被覆蓋。如果文件不存在,創(chuàng)建新文件 |
a | 以追加方式打開(kāi)文件。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾。如果文件不存在,創(chuàng)建新文件進(jìn)行寫(xiě)入 |
r+ | 以讀寫(xiě)方式打開(kāi)文件。文件的指針將會(huì)放在文件的開(kāi)頭。如果文件不存在,拋出異常 |
w+ | 以讀寫(xiě)方式打開(kāi)文件。如果文件存在會(huì)被覆蓋。如果文件不存在,創(chuàng)建新文件 |
a+ | 以讀寫(xiě)方式打開(kāi)文件。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾。如果文件不存在,創(chuàng)建新文件進(jìn)行寫(xiě)入 |
文件打開(kāi)方式
open()是否需要緩沖區(qū)
通常情況下、建議大家在使用 open() 函數(shù)時(shí)打開(kāi)緩沖區(qū),即不需要修改 buffing 參數(shù)的值。
如果 buffing 參數(shù)的值為 0(或者 False),則表示在打開(kāi)指定文件時(shí)不使用緩沖區(qū);如果 buffing 參數(shù)值為大于 1 的整數(shù),該整數(shù)用于指定緩沖區(qū)的大?。▎挝皇亲止?jié));如果 buffing 參數(shù)的值為負(fù)數(shù),則代表使用默認(rèn)的緩沖區(qū)大小。
目前為止計(jì)算機(jī)內(nèi)存的 I/O 速度仍遠(yuǎn)遠(yuǎn)高于計(jì)算機(jī)外設(shè)(例如鍵盤(pán)、鼠標(biāo)、硬盤(pán)等)的 I/O 速度,如果不使用緩沖區(qū),則程序在執(zhí)行 I/O 操作時(shí),內(nèi)存和外設(shè)就必須進(jìn)行同步讀寫(xiě)操作,也就是說(shuō),內(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ū)中,無(wú)需同外設(shè)做同步讀寫(xiě)操作。
3、read 方法 —— 讀取文件
read 方法可以一次性讀入并返回文件的所有內(nèi)容。
read() 函數(shù)的基本語(yǔ)法格式如下:
file.read([size])
其中,file 表示已打開(kāi)的文件對(duì)象;size 作為一個(gè)可選參數(shù),用于指定一次最多可讀取的字符(字節(jié))個(gè)數(shù),如果省略,則默認(rèn)一次性讀取所有內(nèi)容。
如果忘記關(guān)閉文件,會(huì)造成系統(tǒng)資源消耗,而且會(huì)影響到后續(xù)對(duì)文件的訪問(wèn)。
注意:read 方法執(zhí)行后,會(huì)把文件指針移動(dòng)到文件的末尾。
示例:
# 1. 打開(kāi) - 文件名需要注意大小寫(xiě)
file = open("README")# 2. 讀取
text = file.read()
print(text)# 3. 關(guān)閉
file.close()
在開(kāi)發(fā)中,通常會(huì)先編寫(xiě)打開(kāi)和關(guān)閉的代碼,再編寫(xiě)中間針對(duì)文件的讀/寫(xiě)操作!
4、按行讀取文件內(nèi)容
read 方法默認(rèn)會(huì)把文件的所有內(nèi)容一次性讀取到內(nèi)存。
如果文件太大,對(duì)內(nèi)存的占用會(huì)非常嚴(yán)重。
readline 方法可以一次讀取一行內(nèi)容,包含最后的換行符“\n”。方法執(zhí)行后,會(huì)把文件指針移動(dòng)到下一行,準(zhǔn)備再次讀取。
file.readline([size])
其中,file 為打開(kāi)的文件對(duì)象;size 為可選參數(shù),用于指定讀取每一行時(shí),一次最多讀取的字符(字節(jié))數(shù)。
讀取大文件的正確姿勢(shì)
# 打開(kāi)文件 file = open("README") while True: # 讀取一行內(nèi)容 text = file.readline() # 判斷是否讀到內(nèi)容 if not text: break # 每讀取一行的末尾已經(jīng)有了一個(gè) `\n` print(text, end="") # 關(guān)閉文件 file.close()
示例:
小文件復(fù)制
# 1. 打開(kāi)文件 file_read = open("README") file_write = open("README[復(fù)件]", "w") # 2. 讀取并寫(xiě)入文件 text = file_read.read() file_write.write(text) # 3. 關(guān)閉文件 file_read.close() file_write.close()
大文件復(fù)制
# 1. 打開(kāi)文件 file_read = open("README") file_write = open("README[復(fù)件]", "w") # 2. 讀取并寫(xiě)入文件 while True: # 每次讀取一行 text = file_read.readline() # 判斷是否讀取到內(nèi)容 if not text: break file_write.write(text) # 3. 關(guān)閉文件 file_read.close() file_write.close()
對(duì)于按行來(lái)讀取文件,還有一個(gè) readlines() 函數(shù)。
readlines() 函數(shù)用于讀取文件中的所有行,它和調(diào)用不指定 size 參數(shù)的 read() 函數(shù)類似,只不過(guò)該函數(shù)返回是一個(gè)字符串列表,其中每個(gè)元素為文件中的一行內(nèi)容。
和 readline() 函數(shù)一樣,readlines() 函數(shù)在讀取每一行時(shí),會(huì)連同行尾的換行符一塊讀取。
5、文件指針
文件指針可以理解為一個(gè)標(biāo)記,它標(biāo)記從哪個(gè)位置開(kāi)始讀取數(shù)據(jù)。
第一次打開(kāi)文件時(shí),通常文件指針會(huì)指向文件的開(kāi)始位置,當(dāng)執(zhí)行了 read 方法后,文件指針默認(rèn)情況下會(huì)移動(dòng)到讀取內(nèi)容的末尾。
如果執(zhí)行了一次 read 方法,讀取了所有內(nèi)容,那么再次調(diào)用 read 方法,還能夠獲得到內(nèi)容嗎?
答案是不能,第一次讀取之后,文件指針移動(dòng)到了文件末尾,再次調(diào)用不會(huì)讀取到任何的內(nèi)容。
# 首先在 README 文件中寫(xiě)了8個(gè)1
# 1. 打開(kāi) - 文件名需要注意大小寫(xiě)
file = open("README")
# 2. 讀取
text = file.read()
print(text)
text = file.read()
print("-" * 10)
print(text)
# 3. 關(guān)閉
file.close()
#1111111
#----------
#
6、向文件中寫(xiě)入數(shù)據(jù)
Python 中的文件對(duì)象提供了 write() 函數(shù),可以向文件中寫(xiě)入指定內(nèi)容。該函數(shù)的語(yǔ)法格式如下:
file.write(string)
在寫(xiě)入文件完成后,一定要調(diào)用 close() 函數(shù)將打開(kāi)的文件關(guān)閉,否則寫(xiě)入的內(nèi)容不會(huì)保存到文件中。
這是因?yàn)?,?dāng)我們?cè)趯?xiě)入文件內(nèi)容時(shí),操作系統(tǒng)不會(huì)立刻把數(shù)據(jù)寫(xiě)入磁盤(pán),而是先緩存起來(lái),只有調(diào)用 close() 函數(shù)時(shí),操作系統(tǒng)才會(huì)保證把沒(méi)有寫(xiě)入的數(shù)據(jù)全部寫(xiě)入磁盤(pán)文件中。
寫(xiě)入文件示例:
# 打開(kāi)文件
f = open("README", "w")f.write("hello python!\n")
f.write("今天天氣真好")# 關(guān)閉文件
f.close()
如果向文件寫(xiě)入數(shù)據(jù)后,不想馬上關(guān)閉文件,也可以調(diào)用文件對(duì)象提供的 flush() 函數(shù),它可以實(shí)現(xiàn)將緩沖區(qū)的數(shù)據(jù)寫(xiě)入文件中。
f = open("a.txt", 'w')
f.write("寫(xiě)入一行新數(shù)據(jù)")
f.flush()
三、文件/目錄的常用管理操作
在終端 / 文件瀏覽器中可以執(zhí)行常規(guī)的文件 / 目錄管理操作,例如:創(chuàng)建、重命名、刪除、改變路徑、查看目錄內(nèi)容等等。
在 Python 中,如果希望通過(guò)程序?qū)崿F(xiàn)上述功能,需要導(dǎo)入 os 模塊。
1、文件操作
方法名 | 說(shuō)明 | 示例 |
---|---|---|
rename | 重命名文件 | os.rename(源文件名, 目標(biāo)文件名) |
remove | 刪除文件 | os.remove(文件名) |
2、目錄操作
方法名 | 說(shuō)明 | 示例 |
---|---|---|
listdir | 目錄列表 | os.listdir(目錄名) |
mkdir | 創(chuàng)建目錄 | os.mkdir(目錄名) |
rmdir | 刪除目錄 | os.rmdir(目錄名) |
getcwd | 獲取當(dāng)前目錄 | os.getcwd() |
chdir | 修改工作目錄 | os.chdir(目標(biāo)目錄) |
文件或者目錄的操作都支持相對(duì)路徑和絕對(duì)路徑。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python3 循環(huán)讀取excel文件并寫(xiě)入json操作
- python--shutil移動(dòng)文件到另一個(gè)路徑的操作
- python文件操作seek()偏移量,讀取指正到指定位置操作
- python 讀txt文件,按‘,’分割每行數(shù)據(jù)操作
- Python使用文件操作實(shí)現(xiàn)一個(gè)XX信息管理系統(tǒng)的示例
- python實(shí)現(xiàn)npy格式文件轉(zhuǎn)換為txt文件操作
- Python連接HDFS實(shí)現(xiàn)文件上傳下載及Pandas轉(zhuǎn)換文本文件到CSV操作
- python 通過(guò)文件夾導(dǎo)入包的操作
相關(guān)文章
Python中生成隨機(jī)密碼的多種超實(shí)用實(shí)例
隨機(jī)密碼生成器是一種常見(jiàn)的工具,用于生成強(qiáng)密碼,下面這篇文章主要給大家介紹了關(guān)于Python中生成隨機(jī)密碼的多種超實(shí)用實(shí)例,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05python實(shí)現(xiàn)搜索指定目錄下文件及文件內(nèi)搜索指定關(guān)鍵詞的方法
這篇文章主要介紹了python實(shí)現(xiàn)搜索指定目錄下文件及文件內(nèi)搜索指定關(guān)鍵詞的方法,可實(shí)現(xiàn)針對(duì)文件夾及文件內(nèi)關(guān)鍵詞的搜索功能,需要的朋友可以參考下2015-06-06Python學(xué)習(xí)之循環(huán)方法詳解
循環(huán)是有著周而復(fù)始的運(yùn)動(dòng)或變化的規(guī)律;在 Python 中,循環(huán)的操作也叫做 遍歷。與現(xiàn)實(shí)中一樣,Python 中也同樣存在著無(wú)限循環(huán)的方法與有限循環(huán)的方法。本文將通過(guò)示例詳細(xì)講解Python中的循環(huán)方法,需要的可以參考一下2022-03-03