<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在Python中,內建了檔案(File)物件。在使用檔案物件時,首先需要通過內建的open()方法建立一個檔案物件,然後通過該物件提供的方法進行一些基本檔案操作。例如,可以使用檔案物件的write()方法向檔案中寫入內容,以及使用close()方法關閉檔案等。下面將介紹如何應用Python的檔案物件進行基本檔案操作。
在Python中,想要操作檔案需要先建立或者開啟指定的檔案並建立檔案物件。這可以通過內建的open()函數實現。open()函數的基本語法格式如下:
file = open(filename[,mode[,buffering]])
引數說明:
值 | 說明 |
---|---|
r | 以唯讀方式開啟檔案。檔案的指標將會放在檔案的開頭。 |
rb | 以二進位制格式開啟檔案,並採取唯讀模式。檔案的指標將會放在檔案的開頭。一般用於非文字檔案,如照片、音樂等。 |
r+ | 開啟檔案後,可以讀取檔案內容,也可以寫入新的內容覆蓋原有內容(從檔案開頭進行覆蓋) |
rb+ | 以二進位制格式開啟檔案,並採取寫模式。檔案的指標將會放在檔案的開頭。一般用於非文字檔案,如圖片、聲音等。 |
w | 以只寫模式開啟檔案 |
wb | 以二進位制格式開啟檔案,並且採用只寫模式。一般用於非文字檔案,如圖片、聲音等 |
w+ | 開啟檔案後,先清空原有內容,使其變為一個空的檔案,對這個空檔案有讀寫許可權 |
wb+ | 以二進位制格式開啟檔案,並且採用讀寫模式。一般用於非文字檔案,如圖片、聲音等 |
a | 以追加模式開啟一個檔案。如果該檔案已經存在,檔案指標將放在檔案的末尾(即新內容會被寫入到已有內容之後),否則,建立新檔案用於寫入 |
ab | 以二進位制格式開啟一個檔案,並採用追加模式。如果該檔案已存在,檔案指標將會放在檔案的結尾(即新內容會被寫入到已有內容之後),否則,建立新檔案用於寫入 |
a+ | 已讀寫模式開啟檔案。如果該檔案已經存在,檔案指標將放在檔案的末尾(即新內容會被寫入到已有內容之後),否則,建立新檔案用於寫入 |
ab+ | 以二進位制格式開啟一個檔案,並採用追加模式。如果該檔案已經存在,檔案指標將會放在檔案的結尾(即新內容會被寫入到已有內容之後),否則,建立新檔案用於寫入 |
在預設的情況下,使用open()函數開啟一個不存在的檔案,會丟擲如圖所示的異常。
要解決上圖所示的錯誤,主要有以下兩種方法:
使用open()函數不僅可以文字的形式開啟文字檔案,而且可以以二進位制形式開啟非文字檔案,如圖片、音訊檔等。例如,建立一個名稱為picture.jpg的圖片檔案(如圖所示),並且應用open()函數以二進位制方式開啟該檔案。
以二進位制方式開啟該檔案,並輸出建立的物件對的程式碼如下:
file = open("picture.jpg", "rb") print(file)
執行上面程式碼,將顯示如圖所示的結果:
從上圖中可看出,建立的是一個BufferedReader物件。對於該物件生成後,可以再應用其他的第三方模組進行處理。例如,上面的BufferedReader物件是通過開啟圖片檔案實現的。那麼就可以將其傳入到第三期的影象處理庫PIL的Image模組的open()方法中,以便於對影象進行處理(如調整大小等)
在使用open()函數開啟檔案時,預設採用GBK編碼,當被開啟的檔案不是GBK編碼時,將丟擲異常,如圖所示:
解決該問題的方法有兩種,一種直接修改檔案的編碼,另外一種是在開啟檔案時,直接指定使用的編碼方式。推薦採用後一種方法。下面重點介紹如何在開啟檔案時指定編碼方式。
在呼叫open()函數時,通過新增“encoding=‘utf-8’”引數即可實現編碼指定為UTF-8。如果想指定其他編碼可以將單引號中的內容替換為想要指定的編碼即可。
例如,開啟採用UTF-8編碼儲存的notice.txt檔案,可以使用下面的程式碼:
file = open("notice.txt", "r", encoding='utf-8')
開啟檔案後,需要及時關閉,以免對檔案造成不必要的破壞。關閉檔案可以使用檔案物件close()方法實現。close()方法的語法格式如下:
file.close() # 關閉檔案
說明: close()方法先重新整理緩衝區中還沒寫入的資訊,然後再關閉檔案,這樣可以將沒有寫入到檔案的內容寫入到檔案中。在關閉檔案後,便不能再進行寫入操作了。
開啟檔案後,要及時將其關閉,如果忘記關閉可能會帶來意想不到的問題。另外如果在開啟檔案時丟擲異常,那麼將導致檔案不能及時關閉。為了更好地避免此類事情的發生,可以使用Python提供with語句。從而實現在處理檔案時,無論是否丟擲異常,都能保障with語句執行完畢後關閉已經開啟的檔案。with語句的基本語法格式如下:
with expression as target: with-body
引數說明:
expression :用於指定一個表示式,這裡可以是開啟檔案的函數open()。
target:用於指定一個變數,並且將expression 的結果儲存到這個變數中。
with-body:用於指定with語句體,其中可以是執行with語句相關聯的一些操作語句。如果不想執行語句,可以直接使用pass語句來代替。
例如開啟檔案的語句,修改後的程式碼如下:
print("n", "=" * 10, "Python經典應用", "=" * 10) with open("massage.txt", "w") as file: # 建立或開啟儲存Python經典應用資訊的檔案 pass print("n 即將顯示……n")
在前面的內容中,雖然建立並開啟了一個檔案,但是該檔案中並沒有任何內容,它的大小是0kb。Python中的檔案物件提供了write()方法,可以像檔案中寫入內容。write()方法的語法格式如下:
file.write(string)
引數說明:
注意: 在呼叫write()方法向檔案寫入內容的前提是,開啟檔案時,指定的開啟模式為w(可寫)或者a(追加),否則,將丟擲如圖所示的異常:
在Python中開啟檔案後,除了可以向其寫入或追加內容,還可以讀取檔案中的內容。讀取檔案內容主要分為以下幾種情況。
檔案物件提供了read()方法讀取指定個數的字元,其語法格式如下:
file.read([size])
引數說明:
注意: 在呼叫read()方法讀取檔案內容的前提是,開啟檔案時,指定的模式為r(唯讀)或者r+(讀寫),否則,將丟擲如圖所示的異常。
例如,讀取massage.txt中的前9字串,可以使用下列程式碼:
with open("massage.txt", "r", encoding='utf-8') as file: # 開啟檔案 string = file.read(9) # 讀取前9字串 print(string)
例如,massage.txt檔案的內容為:
Python的強度,強度到你無法想象!!!
那麼執行以上程式碼,將顯示以下內容:
使用read([size])方法讀取檔案時,是從檔案的開頭讀取部分內容,可以先使用檔案物件的seek()方法將檔案的指標移動到新的位置,然後在應用read([size])方法讀取,seek()方法基本語法如下:
file.seek(offset[,whence])
引數說明:
注意: 對於 whence引數,如果在開啟檔案時,沒有使用b模式(即rb),那麼只允許從檔案頭開始計算相對位置,從檔案尾計算時就會引發如圖所示的異常:
例如,想要從檔案的第6個字元開始讀取2個字元,可以使用下列程式碼:
with open("message.txt", "r") as file: # 開啟檔案 file.seek(5) # 移動指標到新的位置 string = file.read(2) # 讀取2個字元 print(string)
如果message.txt檔案中內容為:
123456789
那麼執行上面程式碼,將顯示以下結果:
說明: 在使用seek()方法時,offset的值是按照一個漢字佔兩個字元、英文和數位點佔一個字元計算的,這個與read(size)方法不同。
在使用read()方法讀取檔案時,如果檔案很大,一次讀取完全部內容到記憶體,容易造成年記憶體不足,所以採取逐行讀取。檔案物件提供了readline()方法用於每次讀取一行資料。readline()方法的語法格式如下:
file.readline()
其中,file為開啟的檔案物件,同read()方法一樣,開啟檔案時,指定的模式為r(唯讀)或者r+(讀寫)。
print("n", "=" * 20, "Python經典應用", "=" * 20) with open("message.txt", "r", encoding="utf-8") as file: number = 0 # 記錄行號 while True: number += 1 line = file.readline() if line == "": break print(number, line, end="n") print("n ", "=" * 20, "over" * 20, "n")
如果message.txt檔案中內容為下圖所示:
執行上面程式碼,將顯示以下內容:
讀取全部行的作用同呼叫read()方法時不指定size類似,只不過讀取全部行時,返回的是一個字串列表,每個元素為檔案的一行內容。讀取全部行,使用的是檔案物件的readlines()方法,其語法格式如下:
file.readlines()
其中,file為開啟的檔案物件,同read()方法一樣,開啟檔案時,指定的模式為r(唯讀)或者r+(讀寫)。
例如,通過readlines()方法讀取message.txt檔案中所有內容,並輸出讀取內容結果,程式碼如下:
print("n", "=" * 20, "Python經典應用", "=" * 20) with open("message.txt", "r", encoding="utf-8") as file: message = file.readlines() # 讀取全部資訊 print(message) print("n ", "=" * 20, "over", "=" * 20, "n")
執行上面程式碼,將顯示以下內容:
從該執行結果中可以看出readlines()方法的返回值為一個字串列表。在這個字串列表中,每個元素為一行內容。如果檔案較大時,採用這種方法輸出讀取的檔案內容會很慢。這時可以將列表的內容逐行輸出,例如,程式碼可以修改為以下內容:
print("n", "=" * 20, "Python經典應用", "=" * 20) with open("message.txt", "r", encoding="utf-8") as file: messageall = file.readlines() # 讀取全部資訊 for message in messageall: print(message) # 輸出一條資訊 print("n ", "=" * 20, "over", "=" * 20, "n")
執行上面程式碼,將顯示以下內容:
到此這篇關於Python基本檔案操作實用指南的文章就介紹到這了,更多相關Python檔案操作內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45