利用Python判斷文件的幾種方法及其優(yōu)劣對(duì)比
前言
我們知道當(dāng)文件不存在的時(shí)候,open()方法的寫(xiě)模式與追加模式都會(huì)新建文件,但是對(duì)文件進(jìn)行判斷的場(chǎng)景還有很多,比如,在爬蟲(chóng)下載圖片的時(shí)候,可能需要判斷文件是否存在,以免重復(fù)下載;又比如,創(chuàng)建新文件的時(shí)候,可能需要判斷文件是否存在,存在就先做個(gè)備份……所以,學(xué)習(xí)判斷文件是否存在,還是很有必要的。
學(xué)習(xí)是循序漸進(jìn)的過(guò)程,若能建立知識(shí)點(diǎn)間的聯(lián)系,進(jìn)行系統(tǒng)性的學(xué)習(xí),那將更有助于效果。閱讀這篇文章,你將讀到如下內(nèi)容:
1、判斷文件的方法(try語(yǔ)句、os模塊、pathlib模塊)
2、以上幾種方法的優(yōu)劣對(duì)比
懶人的try語(yǔ)句
我們之前學(xué)過(guò),要用with語(yǔ)句來(lái)處理文件讀寫(xiě),但with語(yǔ)句也不是萬(wàn)能的,所以還得關(guān)注一些異常情況。
例如,當(dāng)使用open()方法的時(shí)候,如果文件不存在,程序會(huì)拋出FileNotFoundError異常,而如果權(quán)限不足的話,就會(huì)拋出PersmissionError異常。
with open("python.log", "r") as f: ...: f.read() ----------------------- ...(略) FileNotFoundError: [Errno 2] No such file or directory: 'python.log'
為了避免這些異常導(dǎo)致程序中斷,我們可以用try…except…語(yǔ)句來(lái)捕捉異常,然后在except子句進(jìn)行異常的處理。
不過(guò),在貓貓看來(lái),這個(gè)方法不值得推薦。原因有二,一是這種方法很被動(dòng),程序的健康受制于不可預(yù)測(cè)的異常;二是當(dāng)文件不存在的時(shí)候,我們可能需要去創(chuàng)建文件,這些邏輯如果寫(xiě)在except子句里,可讀性太差了。
傳統(tǒng)的os模塊
顧名思義,Python內(nèi)置的os模塊是用來(lái)與OS(操作系統(tǒng))進(jìn)行交互的模塊,它可以實(shí)現(xiàn)很多在命令行下做的操作,例如,獲取操作系統(tǒng)信息、獲取/修改環(huán)境變量、進(jìn)行目錄操作(創(chuàng)建、刪除、遍歷)和各種文件操作等等。下面,我們要學(xué)習(xí)的是跟文件判斷密切相關(guān)的幾個(gè)方法。
1、os.path.exists()用于判斷文件及文件夾是否存在(注意:因?yàn)閮烧叨寄芘袛?,為了有效區(qū)分文件和文件夾,最好保證文件名是帶后綴的):
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()檢測(cè)文件路徑的訪問(wèn)權(quán)限,語(yǔ)法:os.access(path, mode);其中path指的是文件或者文件夾,mode指的是要檢測(cè)的模式:
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可寫(xiě) os.access("cat/images", os.X_OK) >>>True # path可執(zhí)行
4、os模塊中其它常用方法:
os.mkdir()創(chuàng)建目錄、os.rmdir()刪除目錄、os.rename()重命名、os.remove()刪除文件、os.path.join()連接目錄與文件名、os.path.split()分割目錄與文件名……(不一一舉例了,今后有機(jī)會(huì)再作介紹)
時(shí)尚的pathlib模塊
pathlib模塊是python3.4才加入的模塊,官方介紹它是面向?qū)ο蟮奈募到y(tǒng)路徑(Object-oriented filesystem paths),這是一個(gè)很強(qiáng)大的模塊,文末附錄了官方文檔地址。
這里主要介紹幾個(gè)基本的用法:
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 # 是否文件
幾種方法優(yōu)劣對(duì)比
圍繞文件操作的知識(shí)很多,限于篇幅,本文主要對(duì)判斷文件作了介紹,今后也許還會(huì)對(duì)其它具體話題進(jìn)行學(xué)習(xí)。
現(xiàn)在知道了幾種判斷文件是否存在的方法,貓貓?jiān)囍鶕?jù)自己的理解,對(duì)它們做一下評(píng)判。
首先,try語(yǔ)句的缺點(diǎn)是沒(méi)有主動(dòng)做判斷,不方便根據(jù)文件是否存在而做針對(duì)性的處理,它把必要的邏輯交給異常捕獲,多少顯得“不負(fù)責(zé)任”;try語(yǔ)句也有優(yōu)點(diǎn),一是不需要引入模塊,不需要區(qū)分各種使用方法,二是將其它可能存在的異常都打包,避免多系統(tǒng)或者多場(chǎng)景的遺漏。
os模塊是傳統(tǒng)的老模塊了,在使用上和維護(hù)上都會(huì)比較順暢;它的主要缺點(diǎn)在于有的方法比較繁瑣,比如由于使用字符串來(lái)表示文件路徑,這會(huì)導(dǎo)致路徑拼接上的麻煩。另外,不同操作系統(tǒng)在路徑分隔符上的差異(Windows使用\分隔符,Linux和Mac使用/分隔符),也可能導(dǎo)致難以發(fā)現(xiàn)的錯(cuò)誤。
相對(duì)來(lái)說(shuō),pathlib功能最強(qiáng)大,但普及度比較低,有一定的學(xué)習(xí)門(mén)檻;它主要的優(yōu)點(diǎn)是面向?qū)ο?,同時(shí),因?yàn)閷?duì)不同操作系統(tǒng)的特性做了封裝,能有效避免字符串表示文件路徑的難題。它也有不足之處,即沒(méi)有像os.access()這種可以檢測(cè)訪問(wèn)權(quán)限的方法,雖然這個(gè)方法基本不會(huì)使用到。
下面比較了三種拼接文件路徑的方法,方法一未對(duì)分隔符做處理,不能保證在每個(gè)操作系統(tǒng)都能找到;方法二需要反復(fù)使用os.path.join;方法三只用“/"就能拼接路徑,而且肯定支持多操作系統(tǒng)。
# 錯(cuò)誤拼接:未處理分隔符 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"
總結(jié)一下,如果文件路徑簡(jiǎn)單,僅僅要用到exists()、is_dir()、is_file() 這幾個(gè)方法的話,os.path模塊和pathlib.Path模塊不分伯仲,都很好用,但是如果考慮到繁復(fù)的路徑拼接的話,pathlib.Path就會(huì)勝出一籌。
總結(jié)
到此這篇關(guān)于利用Python判斷文件的幾種方法及其優(yōu)劣對(duì)比的文章就介紹到這了,更多相關(guān)Python判斷文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python PyInstaller庫(kù)基本使用方法分析
這篇文章主要介紹了Python PyInstaller庫(kù)基本使用方法,結(jié)合實(shí)例形式分析了Python PyInstaller庫(kù)的功能、安裝及相關(guān)使用注意事項(xiàng),需要的朋友可以參考下2019-12-12Python實(shí)現(xiàn)常見(jiàn)數(shù)據(jù)格式轉(zhuǎn)換的方法詳解
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)常見(jiàn)數(shù)據(jù)格式轉(zhuǎn)換的方法,主要是xml_to_csv和csv_to_tfrecord,感興趣的小伙伴可以了解一下2022-09-09Python中關(guān)于matplotlib圖片的灰度處理方式
這篇文章主要介紹了Python中關(guān)于matplotlib圖片的灰度處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08python中readline判斷文件讀取結(jié)束的方法
這篇文章主要介紹了python中readline判斷文件讀取結(jié)束的方法,實(shí)例形式詳細(xì)分析了Python中readline的用法,需要的朋友可以參考下2014-11-11Django request.META.get()獲取不到header頭的原因分析
這篇文章主要介紹了Django request.META.get()獲取不到header頭的原因分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04細(xì)數(shù)nn.BCELoss與nn.CrossEntropyLoss的區(qū)別
今天小編就為大家整理了一篇細(xì)數(shù)nn.BCELoss與nn.CrossEntropyLoss的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02python爬蟲(chóng)lxml庫(kù)解析xpath網(wǎng)頁(yè)過(guò)程示例
這篇文章主要為大家介紹了python爬蟲(chóng)lxml庫(kù)解析xpath網(wǎng)頁(yè)的過(guò)程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05使用python實(shí)現(xiàn)抓取中國(guó)銀行外匯牌價(jià)首頁(yè)數(shù)據(jù)實(shí)現(xiàn)
這篇文章主要為大家介紹了如何使用python實(shí)現(xiàn)抓取中國(guó)銀行外匯牌價(jià)首頁(yè)數(shù)據(jù)的實(shí)現(xiàn)示例,有需要的同學(xué)可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10