詳解Python中os.path與pathlib的用法和性能對(duì)比
pathlib 模塊是在Python3.4版本中首次被引入到標(biāo)準(zhǔn)庫(kù)中的,作為一個(gè)可選模塊。
從Python3.6開(kāi)始,內(nèi)置的 open 函數(shù)以及 os 、 shutil 和 os.path 模塊中的各種函數(shù)都可以正確地使用 pathlib.Path 對(duì)象了。
最初,pathlib給人的感覺(jué)只是os.path的一個(gè)不必要的面向?qū)ο蟀姹荆?/p>
不過(guò),當(dāng)你實(shí)際去了解pathlib之后,會(huì)發(fā)現(xiàn)pathlib實(shí)際上絕不是一個(gè)簡(jiǎn)單的面向?qū)ο蟀姹荆?/p>
而是實(shí)實(shí)在在的解決了os.path存在的一些問(wèn)題。
1. os.path VS pathlib
1.1. 路徑規(guī)范化
對(duì)于os.path來(lái)說(shuō),路徑的分隔用正斜桿(\)還是反斜杠(/)需要自己根據(jù)操作系統(tǒng)來(lái)確定。
或者,每一個(gè)路徑拼接的地方,都用os.path.join來(lái)連接。
而使用pathlib的話,直接用反斜杠(/)即可,不用擔(dān)心操作系統(tǒng)的不同。
比如:
import os
# windows系統(tǒng)中測(cè)試
os.path.join("a/b", "c.txt")
# 運(yùn)行結(jié)果 錯(cuò)誤
# 'a/b\\c.txt'
os.path.join("a", "b", "c.txt")
# 運(yùn)行結(jié)果 正確
# 'a\\b\\c.txt'
從代碼可以看出,每一層文件夾都必須用join連接才能正確適應(yīng)不同系統(tǒng)。
而在pathlib中,則不需要考慮這么多。
from pathlib import Path
Path("a/b").joinpath("c.txt")
# WindowsPath('a/b/c.txt')
Path("a").joinpath("b").joinpath("c.txt")
# WindowsPath('a/b/c.txt')
使用pathlib,在windows或者linux中,統(tǒng)一使用反斜杠(/)來(lái)分隔文件夾。
路徑規(guī)范化之后的好處就是代碼更加簡(jiǎn)潔。
比如:下面這個(gè)重命名文件的例子(a/b/c/d.csv => a/b/c.csv)
# os.path 方式
os.rename(os.path.join("a", "b", "c", "d.csv"), os.path.join("a", "b", "c.csv"))
# pathlib 方式
Path("a/b/c/d.csv").reanme("a/b/c.csv")
哪種方式更清晰簡(jiǎn)潔不言而喻。
1.2. 字符串和對(duì)象
為什么要用對(duì)象來(lái)表示路徑?
先看下面3個(gè)字符串變量:
student = '{"name": "databook", "score": "90"}'
graduate_date = "2023-07-01"
home_directory = '/home/databook'
這3個(gè)字符串其實(shí)代表不同的事物:一種是 JSON blob,一種是日期,一種是文件路徑。
再看下面3個(gè)用對(duì)象表示的變量:
from datetime import date
from pathlib import Path
student = {"name": "databook", "score": "90"}
graduate_date = date(2023, 7, 1)
home_directory = Path('/home/databook')
用字符串來(lái)表示變量確實(shí)簡(jiǎn)潔,但也導(dǎo)致每個(gè)變量失去了其本身的意義,
程序無(wú)法區(qū)分這個(gè)變量代表的是JSON,還是日期,還是一個(gè)路徑,從而增加了程序的不確定性。
程序規(guī)模大了,或者復(fù)雜性提高了之后,存在很大的隱患。
os.path和pathlib就是這樣的關(guān)系,os.path使用字符串表示路徑,pathlib使用Path對(duì)象表示路徑。
1.3. 讀寫(xiě)文件
pathlib的路徑對(duì)象(Path)可以直接讀寫(xiě)文件,因此也能大大簡(jiǎn)化讀寫(xiě)文件的代碼。
不用pathlib的讀寫(xiě)文件方式:
import os
# 讀取文件
fp = os.path.join("a", "b.txt")
with open(fp, "r") as f:
f.read()
# 寫(xiě)入文件
with open(fp, "w") as f:
f.write("hello")
使用pathlib的話:
from pathlib import Path
# 讀取文件
Path("a/b.txt").read_text()
# 寫(xiě)入文件
Path("a/b.txt").write_text("hello)
2. pathlib的性能
pathlib用面向?qū)ο蟮姆绞教幚砺窂?,難免讓人覺(jué)得會(huì)比傳統(tǒng)的方式慢很多,也就是存在性能問(wèn)題。
那么,pathlib到底會(huì)比傳統(tǒng)方式慢多少?通過(guò)下面的簡(jiǎn)單示例來(lái)看看。
傳統(tǒng)方式:
def a(d="D:/miniconda3/Lib/site-packages"):
from os import getcwd, walk
extension = ".py"
count = 0
for root, directories, filenames in walk(d):
for filename in filenames:
if filename.endswith(extension):
count += 1
print(f"{count} Python files found")
if __name__ == "__main__":
import time
t0 = time.time()
a()
t1 = time.time()
print(t1 - t0)
# 運(yùn)行結(jié)果:
7875 Python files found
0.31201744079589844
pathlib方式:
def b(d="D:/miniconda3/Lib/site-packages"):
from pathlib import Path
extension = ".py"
count = 0
for filename in Path(d).rglob(f"*{extension}"):
count += 1
print(f"{count} Python files found")
if __name__ == "__main__":
import time
t0 = time.time()
b()
t1 = time.time()
print(t1 - t0)
# 運(yùn)行結(jié)果:
7875 Python files found
0.44898128509521484
讀取的標(biāo)準(zhǔn)庫(kù)中的文件,總共將近8000個(gè)文件,運(yùn)行多次后,時(shí)間大概相差0.1秒左右。
pathlib的性能確實(shí)略遜于傳統(tǒng)方式,但是將近8000個(gè)文件,也只慢了0.1秒,
如果不是大規(guī)模處理文件的話,還是用pathlib更好。
3. 總結(jié)
總的來(lái)說(shuō),與傳統(tǒng)的 os.path 模塊相比,pathlib 提供了一種更現(xiàn)代和面向?qū)ο蟮姆绞絹?lái)處理文件路徑。
它支持跨平臺(tái)的文件路徑操作,使得開(kāi)發(fā)者可以更容易地編寫(xiě)可移植的代碼。
此外,pathlib 還提供了鏈?zhǔn)秸{(diào)用的能力,使得代碼更加簡(jiǎn)潔和易讀。
因此,為了代碼更加簡(jiǎn)潔、易讀和可維護(hù),推薦使用 pathlib 來(lái)替代傳統(tǒng)的 os.path。
到此這篇關(guān)于詳解Python中os.path與pathlib的用法和性能對(duì)比的文章就介紹到這了,更多相關(guān)Python os.path pathlib內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用sort和class實(shí)現(xiàn)的多級(jí)排序功能示例
這篇文章主要介紹了Python使用sort和class實(shí)現(xiàn)的多級(jí)排序功能,涉及Python基于面向?qū)ο蟮脑乇闅v、列表排序、添加等相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
python+os根據(jù)文件名自動(dòng)生成文本
這篇文章主要為大家詳細(xì)介紹了python+os根據(jù)文件名自動(dòng)生成文本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
Python實(shí)現(xiàn)標(biāo)記數(shù)組的連通域
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Python實(shí)現(xiàn)標(biāo)記數(shù)組的連通域,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,需要的可以參考一下2023-04-04
python函數(shù)默認(rèn)參數(shù)使用避坑指南
這篇文章主要為大家介紹了python函數(shù)默認(rèn)參數(shù)使用的踩雷避坑詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Python獲取統(tǒng)計(jì)自己的qq群成員信息的方法
這篇文章主要介紹了Python獲取統(tǒng)計(jì)自己的qq群成員信息的方法,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
詳解python如何正確使用時(shí)間戳,日期,時(shí)間,時(shí)區(qū)
這篇文章主要為大家介紹了如何在python中正確使用時(shí)間戳,日期,時(shí)間,時(shí)區(qū),文中通過(guò)簡(jiǎn)單的示例進(jìn)行了詳細(xì)介紹,希望對(duì)大家有一定的幫助2024-11-11
Python中的作用域==和is的區(qū)別及說(shuō)明
這篇文章主要介紹了Python中的作用域==和is的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01

