網站首頁 編程語言 正文
前言
我們知道當文件不存在的時候,open()方法的寫模式與追加模式都會新建文件,但是對文件進行判斷的場景還有很多,比如,在爬蟲下載圖片的時候,可能需要判斷文件是否存在,以免重復下載;又比如,創建新文件的時候,可能需要判斷文件是否存在,存在就先做個備份……所以,學習判斷文件是否存在,還是很有必要的。
學習是循序漸進的過程,若能建立知識點間的聯系,進行系統性的學習,那將更有助于效果。閱讀這篇文章,你將讀到如下內容:
1、判斷文件的方法(try語句、os模塊、pathlib模塊)
2、以上幾種方法的優劣對比
懶人的try語句
我們之前學過,要用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子句里,可讀性太差了。
傳統的os模塊
顧名思義,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模塊
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就會勝出一籌。
總結
原文鏈接:https://juejin.cn/post/7111159430544113678
相關推薦
- 2022-03-14 1709 - Index column size too large. The maximum co
- 2022-04-27 Numpy的各種下標操作的示例代碼_python
- 2022-09-18 Go語言實現文件上傳_Golang
- 2022-09-01 Nginx?部署的虛擬主機使用?Let's?Encrypt?加密?https的方法_nginx
- 2022-08-18 kubernetes?k8s常用問題排查方法_云其它
- 2022-04-17 iOS喚起記住密碼的數字鍵盤,輸入的時候發生閃爍的問題
- 2023-05-06 python?字典的概念敘述和使用方法_python
- 2022-09-07 Go編寫定時器與定時任務詳解(附第三方庫gocron用法)_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支