<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們知道當檔案不存在的時候,open()方法的寫模式與追加模式都會新建檔案,但是對檔案進行判斷的場景還有很多,比如,在爬蟲下載圖片的時候,可能需要判斷檔案是否存在,以免重複下載;又比如,建立新檔案的時候,可能需要判斷檔案是否存在,存在就先做個備份……所以,學習判斷檔案是否存在,還是很有必要的。
學習是循序漸進的過程,若能建立知識點間的聯絡,進行系統性的學習,那將更有助於效果。閱讀這篇文章,你將讀到如下內容:
1、判斷檔案的方法(try語句、os模組、pathlib模組)
2、以上幾種方法的優劣對比
我們之前學過,要用with語句來處理檔案讀寫,但with語句也不是萬能的,所以還得關注一些異常情況。
例如,當使用open()方法的時候,如果檔案不存在,程式會丟擲FileNotFoundError異常,而如果許可權不足的話,就會丟擲PersmissionError異常。
with open("python.log", "r") as f: ...: f.read() ----------------------- ...(略) FileNotFoundError: [Errno 2] No such file or directory: 'python.log'
為了避免這些異常導致程式中斷,我們可以用try…except…語句來捕捉異常,然後在except子句進行異常的處理。
不過,在貓貓看來,這個方法不值得推薦。原因有二,一是這種方法很被動,程式的健康受制於不可預測的異常;二是當檔案不存在的時候,我們可能需要去建立檔案,這些邏輯如果寫在except子句裡,可讀性太差了。
顧名思義,Python內建的os模組是用來與OS(作業系統)進行互動的模組,它可以實現很多在命令列下做的操作,例如,獲取作業系統資訊、獲取/修改環境變數、進行目錄操作(建立、刪除、遍歷)和各種檔案操作等等。下面,我們要學習的是跟檔案判斷密切相關的幾個方法。
1、os.path.exists()用於判斷檔案及資料夾是否存在(注意:因為兩者都能判斷,為了有效區分檔案和資料夾,最好保證檔名是帶字尾的):
import os # 檔案存在 VS 不存在 os.path.exists("test.txt") >>>True os.path.exists("cat.txt") >>>False # 資料夾存在 VS 不存在 os.path.exists("cat/images") >>>True os.path.exists("cat/image") >>>False
2、os.path.isfile()、os.path.isdir() 判斷給定的路徑是檔案還是資料夾:
os.path.isfile("cat/images") >>>False os.path.isdir("cat/images") >>>True os.path.isfile("test.txt") >>>True
3、os.access()檢測檔案路徑的存取許可權,語法:os.access(path, mode);其中path指的是檔案或者資料夾,mode指的是要檢測的模式:
os.access("cat/images", os.F_OK) >>>True # path存在 os.access("cat/images", os.R_OK) >>>True # path可讀 os.access("cat/images", os.W_OK) >>>True # path可寫 os.access("cat/images", os.X_OK) >>>True # path可執行
4、os模組中其它常用方法:
os.mkdir()建立目錄、os.rmdir()刪除目錄、os.rename()重新命名、os.remove()刪除檔案、os.path.join()連線目錄與檔名、os.path.split()分割目錄與檔名……(不一一舉例了,今後有機會再作介紹)
pathlib模組是python3.4才加入的模組,官方介紹它是物件導向的檔案系統路徑(Object-oriented filesystem paths),這是一個很強大的模組,文末附錄了官方檔案地址。
這裡主要介紹幾個基本的用法:
import pathlib file_obj = pathlib.Path("test.txt") file_obj.name >>>'test.txt' # 檔名 file_obj.exists() >>> True # 是否存在 file_obj.is_dir() >>>False # 是否資料夾 file_obj.is_file() >>>True # 是否檔案
圍繞檔案操作的知識很多,限於篇幅,本文主要對判斷檔案作了介紹,今後也許還會對其它具體話題進行學習。
現在知道了幾種判斷檔案是否存在的方法,貓貓試著根據自己的理解,對它們做一下評判。
首先,try語句的缺點是沒有主動做判斷,不方便根據檔案是否存在而做針對性的處理,它把必要的邏輯交給異常捕獲,多少顯得“不負責任”;try語句也有優點,一是不需要引入模組,不需要區分各種使用方法,二是將其它可能存在的異常都打包,避免多系統或者多場景的遺漏。
os模組是傳統的老模組了,在使用上和維護上都會比較順暢;它的主要缺點在於有的方法比較繁瑣,比如由於使用字串來表示檔案路徑,這會導致路徑拼接上的麻煩。另外,不同作業系統在路徑分隔符上的差異(Windows使用分隔符,Linux和Mac使用/分隔符),也可能導致難以發現的錯誤。
相對來說,pathlib功能最強大,但普及度比較低,有一定的學習門檻;它主要的優點是物件導向,同時,因為對不同作業系統的特性做了封裝,能有效避免字串表示檔案路徑的難題。它也有不足之處,即沒有像os.access()這種可以檢測存取許可權的方法,雖然這個方法基本不會使用到。
下面比較了三種拼接檔案路徑的方法,方法一未對分隔符做處理,不能保證在每個作業系統都能找到;方法二需要反覆使用os.path.join;方法三隻用“/"就能拼接路徑,而且肯定支援多作業系統。
# 錯誤拼接:未處理分隔符 data_folder = "source_data/text_files/" file_to_open = data_folder + "test.txt" # os模組拼接 import os data_folder = os.path.join("source_data", "text_files") file_to_open = os.path.join(data_folder, "test.txt") # pathlib模組拼接 from pathlib import Path data_folder = Path("source_data/text_files/") file_to_open = data_folder / "test.txt"
總結一下,如果檔案路徑簡單,僅僅要用到exists()、is_dir()、is_file() 這幾個方法的話,os.path模組和pathlib.Path模組不分伯仲,都很好用,但是如果考慮到繁複的路徑拼接的話,pathlib.Path就會勝出一籌。
到此這篇關於利用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