Python使用pathlib庫實現(xiàn)優(yōu)雅的處理路徑
前言
如果你需要在 Python 里進(jìn)行文件處理,那么標(biāo)準(zhǔn)庫中的os
和os.path
兄弟倆一定是你無法避開的兩個模塊。它們提供了非常多與文件路徑處理、文件讀寫、文件狀態(tài)查看相關(guān)的工具函數(shù)。
os.path
一直是Python中處理路徑事實上的標(biāo)準(zhǔn),但它可能會顯得有些繁瑣。與之相比,pathlib
模塊提供了更簡單、更直觀的方式來完成絕大多數(shù)任務(wù)。
在Python3.4開始,官方提供了pathlib
面向?qū)ο蟮奈募到y(tǒng)路徑,核心的點在于面向?qū)ο螅?這也是os.path
和pathlib
的本質(zhì)區(qū)別。
2019年Django也將os.path替換成了pathlib。
為什么需要pathlib
在pathlib
出現(xiàn)之前,Python的標(biāo)準(zhǔn)庫os
及os.path
支持操作文件路徑,使用字符串表示文件路徑。
>>> import os.path >>> os.path.abspath('test') 'F:\\spug-3.0\\spug-3.0\\spug_api\\test'
或者寫出下面這種長長的代碼:
>>> import os.path >>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt')) False
但是路徑并不只是一個字符串,如果需要對文件進(jìn)行操作,需要結(jié)合使用多個標(biāo)準(zhǔn)庫的功能,如: 需要移動當(dāng)前目錄下的一些文件到備份目錄,需要使用os
,glob
和shutil
庫。
import glob import os import shutil for file_name in glob.glob('*.txt'): new_path = os.path.join('archive', file_name) shutil.move(file_name, new_path)
而且,由于不同的操作系統(tǒng)使用的分隔符不同,使用字符串拼接路徑就容易出現(xiàn)問題。
有了pathlib
,使得上述的問題變得更加輕松,pathlib創(chuàng)建的Path對象,可以直接通過正斜杠運算符/
連接字符串生成新的對象。
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 import pathlib from pathlib import WindowsPath path = pathlib.Path() if __name__ == '__main__': print(path) # . print(path.absolute() / 'test' / 'data.txt') # F:\spug-3.0\spug-3.0\spug_api\test\data.txt
pathlib的基本使用
Path類的常用屬性和方法
descriptor:
parts: 每一層路徑
parent: 父目錄
parents: 所有父目錄
stem: 不帶后綴的文件名
name: 文件名或目錄名
suffix: 文件名后綴
suffixes: 文件名后綴列表
function:
is_absolute: 是否為絕對路徑
joinpath: 組合路徑
cwd: 當(dāng)前工作目錄
home: 根目錄
rename: 重命名
replace: 覆蓋
touch: 新建文件
exists: 是否存在路徑
expanduser: 返回帶~和~user的路徑
glob: 列出匹配的文件或目錄
rglob: 遞歸列出匹配的文件或目錄
is_dir: 是否為目錄
is_file: 是否為文件
iterdir: 列出路徑下的文件和目錄
mkdir: 新建目錄
open: 打開文件
resolve: 轉(zhuǎn)成絕對路徑
rmdir: 刪除目錄
...
創(chuàng)建路徑
前面用到了pathlib.Path()
獲取當(dāng)前路徑的方法,也可以顯示的傳入路徑字符串進(jìn)行路徑創(chuàng)建,支持相對路徑和絕對路徑字符串的傳遞。
os.path
from os.path import abspath, dirname, join manage_path = abspath("./manage.py") # 絕對路徑 base_dir = dirname(manage_path) # 父目錄 another_manage_path = join(base_dir, "another_manage.py") # 構(gòu)成新路徑 print("manage_path:", manage_path) print("base_dir:", base_dir) print("another_manage_path:", another_manage_path) # manage_path: F:\spug-3.0\spug-3.0\spug_api\manage.py # base_dir: F:\spug-3.0\spug-3.0\spug_api # another_manage_path: F:\spug-3.0\spug-3.0\spug_api\another_manage.py
pathlib
from pathlib import Path manage_path = Path("manage.py").resolve() # 絕對路徑 base_dir = manage_path.parent # 父目錄 another_manage_path = base_dir / "another_manage.py" # 構(gòu)成新路徑 print("manage_path:", manage_path) print("base_dir:", base_dir) print("another_manage_path:", another_manage_path)
顯然用pathlib更加便捷和優(yōu)雅!!
創(chuàng)建文件 Path.touch()
from pathlib import Path path = Path() new_path = path / "hello.py" new_path.touch()
創(chuàng)建目錄和重命名
os.path
import os import os.path os.makedirs(os.path.join("./src", "stuff"), exist_ok=True) # 構(gòu)建目錄./src/stuff os.rename("./src/stuff", "./src/config") # 將./src/stuff重命名為./src/config
pathlib
from pathlib import Path Path("./src/stuff").mkdir(parents=True, exist_ok=True) # 構(gòu)建目錄./src/stuff Path("./src/stuff").rename("./src/config") # 將./src/stuff重命名為./src/config
mkdir方法:
- parents默認(rèn)為False,父目錄不存在時拋出FileNotFoundError
- exist_ok默認(rèn)為False,該目錄存在時拋出FileExistsError
遞歸列出某類型文件
假設(shè)目錄:
(spug-3.0) PS F:\spug-3.0\spug-3.0\spug_api\path_lib_test> tree /F F:. │ pathlib_test.py │ __init__.py │ └─test __init__.py
列出所有.py
文件
os
# ! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from os import walk from os.path import join, expanduser, abspath home = expanduser('~') python_files = [] for root, dirs, files in walk("./test"): python_files.extend([abspath(join(root, file)) for file in files if file.endswith('.mp4')]) # 現(xiàn)在python_files列表包含所有以'.mp4'結(jié)尾的文件的絕對路徑 print(python_files) # ['F:\\spug-3.0\\spug-3.0\\spug_api\\path_lib_test\\test\\1.mp4']
glob
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from glob import glob top_level_py_files = glob("./*.py") all_py_files = glob("./**/*.py", recursive=True) # 遞歸 print(top_level_py_files) print(all_py_files) # ['.\\pathlib_test.py', '.\\__init__.py'] # ['.\\pathlib_test.py', '.\\__init__.py', '.\\test\\__init__.py']
pathlib
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path top_level_py_files = Path(".").glob("*.py") # 不進(jìn)行遞歸 all_py_files = Path(".").rglob("*.py") # 遞歸 print(list(top_level_py_files)) print(list(all_py_files)) # [WindowsPath('pathlib_test.py'), WindowsPath('__init__.py')] # [WindowsPath('pathlib_test.py'), WindowsPath('__init__.py'), WindowsPath('test/__init__.py')]
glob不會確定地返回路徑順序。
打開多個文件并讀取內(nèi)容
glob
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from glob import glob contents = [] for fname in glob("./**/*init*.py", recursive=True): with open(fname, "r") as f: contents.append(f.read()) print(contents) # ["#! -*-conding=: UTF-8 -*-\n# 2023/12/6 17:20\n\n\nif __name__ == '__main__':\n pass\n", "#! -*-conding=: UTF-8 -*-\n# 2023/12/6 17:22\n\n\nif __name__ == '__main__':\n pass\n"]
pathlib
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path contents = [] for path in Path(".").rglob("*__init__.py"): with path.open("r", encoding="UTF-8") as file: contents.append(file.read()) print(contents) # ["#! -*-conding=: UTF-8 -*-\n# 2023/12/6 17:20\n\n\nif __name__ == '__main__':\n pass\n", "#! -*-conding=: UTF-8 -*-\n# 2023/12/6 17:22\n\n\nif __name__ == '__main__':\n pass\n"]
操作符
使用/
取代os.path.join
進(jìn)行路徑拼接。
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path base_dir = Path(".") child_dir = base_dir / "test" file_path = child_dir / "__init__.py" print(file_path) # test\__init__.py
路徑的每個位置 Path.parts
from pathlib import Path file_path = Path("F:/spug-3.0/spug-3.0/spug_api/pathlib_test.py") print(file_path.parts) # ('F:\\', 'spug-3.0', 'spug-3.0', 'spug_api', 'pathlib_test.py')
父目錄 Path.parents & Path.parent
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path file_path = Path("path_lib_test/test/__init__.py") print(file_path.parents) # <WindowsPath.parents> for parent in file_path.parents: print(parent) # path_lib_test\test # path_lib_test # . print(file_path.parent) # path_lib_test\test
文件名或目錄名 Path.name
os.path
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 import os print(os.path.basename("test/__init__.py")) # __init__.py print(os.path.basename("test")) # test
pathlib
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path print(Path("test/__init__.py").name) # __init__.py print(Path("test").name) # test
文件名后綴 Path.suffixes & Path.suffix
os.path
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 import os print(os.path.splitext("test/__init__.py")[-1]) # ('test/__init__', '.py')
pathlib
from pathlib import Path file_path = Path("test/__init__.py") print(file_path.suffixes) # ['.py'] print(file_path.suffix) # .py
不帶后綴文件名 Path.stem
os.path
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 import os print(os.path.splitext(os.path.basename("test/__init__.py"))[0]) # __init__
pathlib
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path print(Path("test/__init__.py").stem) # __init__
是否為絕對路徑 Path.is_absolute()
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path file_path = Path("test/__init__.py") print(file_path.is_absolute()) # False
組合路徑 Path.joinpath(*other)
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path file_path = Path(".").joinpath("test", "__init__.py") print(file_path) # test\__init__.py
獲取當(dāng)前工作目錄 Path.cwd()
和 os.getcwd() 返回的相同
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path file_path = Path() print(file_path.cwd()) # F:\spug-3.0\spug-3.0\spug_api\path_lib_test
根目錄 Path.home()
返回一個表示用戶家目錄的新路徑對象。
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path print(Path.home()) # C:\Users\lianhf
是否存在路徑 Path.exists()
os.path
import os.path print(os.path.exists("test/aaaa.py")) # False
pathlib
from pathlib import Path file_path = Path("test/aaaa.py") print(file_path.exists()) # False
返回帶和user的路徑 Path.expanduser()
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path file_path = Path("~/test/aaaa.py") print(file_path.expanduser()) # C:\Users\lianhf\test\aaaa.py
是否為目錄或文件 Path.is_dir() & Path.is_file()
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path dir_path = Path("test/") print(dir_path.is_dir()) # True print(dir_path.is_file()) # False file_path = Path("test/__init__.py") print(file_path.is_dir()) # False print(file_path.is_file()) # True
列出路徑下的文件和目錄 Path.iterdir()
產(chǎn)生該路徑下的對象的路徑
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path base_path = Path(".") contents = [content for content in base_path.iterdir()] print(contents) # [WindowsPath('pathlib_test.py'), WindowsPath('test'), WindowsPath('__init__.py')]
打開文件 Path.open()
事實上,Path.open() 是在幕后調(diào)用內(nèi)置的 open() 函數(shù)。這就是為什么你可以在 Path.open() 中使用模式和編碼等參數(shù)。
#!usr/bin/env python # -*- coding:utf-8 _*- # __time__:2023/12/6 21:37 from pathlib import Path path = Path.cwd() / "簡答題.md" with path.open(mode="r", encoding="utf-8") as md_file: content = md_file.read() groceries = [line for line in content.splitlines() if line.startswith("##")] print("\n".join(groceries))
覆蓋/移動 Path.replace()
將文件或目錄重命名為給定的 target,并返回一個新的指向 target 的 Path 實例。
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path path = Path("test/__init__.py") path.replace(path.parent / "__init2__.py")
轉(zhuǎn)成絕對路徑 Path.resolve()
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path path = Path("test/__init__.py") print(path.resolve()) # F:\spug-3.0\spug-3.0\spug_api\path_lib_test\test\__init__.py
strict設(shè)為True,如果路徑不存在,則拋出FileNotFoundError
刪除目錄 Path.rmdir()
移除此目錄。此目錄必須為空的。
os.path
import os os.rmdir("test/hello")
如果目錄下不為空,拋出OSError
pathlib
from pathlib import Path file_path = Path("test/hello") file_path.rmdir()
如果目錄下不為空,拋出OSError
刪除文件 os.remove()/Path.unlink()
os
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 import os os.remove("test/hello.txt")
pathlib
#!usr/bin/env python # -*- coding:utf-8 _*- # __time__:2023/12/6 21:37 from pathlib import Path p = Path('./username.txt') p.unlink()
讀寫文件
.read_text()
: 以文本模式打開路徑,并以字符串形式返回內(nèi)容。.read_bytes()
: 以二進(jìn)制模式打開路徑,并以字節(jié)字符串形式返回內(nèi)容。.write_text()
: 打開路徑并寫入字符串?dāng)?shù)據(jù)。.write_bytes()
: 以二進(jìn)制模式打開路徑并向其中寫入數(shù)據(jù)。
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path # 除此之外,還有幾個很甜的方法,省去了 with open 語句 path = Path("/home/ubuntu/readme.txt") text = path.read_text(encoding="utf-8") path.write_text(text) path = Path("/home/ubuntu/image.png") image = path.read_bytes() path.write_bytes(image)
上述每個方法都會處理文件的打開和關(guān)閉。
移動文件 shutil.move()/path.rename()/path.replace()
shutil
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 import shutil shutil.move('./__init__.py', './test')
pathlib
可以使用path.rename()
或者path.replace()
移動文件:
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path path = Path('test/__init2__.py') folder = Path('.') path.rename(folder / path.name)
from pathlib import Path source = Path("hello.py") destination = Path("goodbye.py") if not destination.exists(): source.replace(destination)
上面的代碼并非并發(fā)安全的!這里僅提供實現(xiàn)思路。
也可以換一種思路:
from pathlib import Path import fcntl source = Path("hello.py") destination = Path("goodbye.py") lock_file = Path("lock_file.lock") try: with lock_file.open(mode="xb") as lock: fcntl.flock(lock, fcntl.LOCK_EX) # 獲取獨占鎖 try: with destination.open(mode="xb") as file: file.write(source.read_bytes()) except FileExistsError: print(f"File {destination} exists already.") else: source.unlink() finally: fcntl.flock(lock, fcntl.LOCK_UN) # 釋放鎖 except FileExistsError: print(f"Another process is already handling the operation.")
重命名文件
文件重命名除了可以使用上述的path.rename()
,還可以使用.with_stem()
, .with_suffix()
, 或者.with_name()
結(jié)合.replace()
來實現(xiàn)。
#!usr/bin/env python # -*- coding:utf-8 _*- # __time__:2023/12/6 21:37 from pathlib import Path txt_path = Path("./hello.txt") md_path = txt_path.with_suffix(".md") txt_path.replace(md_path)
使用.with_suffix()
會返回一個新路徑。要真正重命名文件,需要使用.replace()
。這將把txt_path
移到md_path
,并在保存時重命名它。
如果要更改包括擴(kuò)展名在內(nèi)的完整文件名,可以使用.with_name()
:
from pathlib import Path md_path = Path("./hello.md") txt_path = md_path.with_name("goodbye.md") md_path.replace(txt_path)
文件復(fù)制
令人驚訝的是,Path
并沒有復(fù)制文件的方法。不過,利用目前學(xué)到的pathlib
知識,只需幾行代碼就能創(chuàng)建相同的功能:
from pathlib import Path source = Path("shopping_list.md") destination = source.with_stem("shopping_list_02") destination.write_bytes(source.read_bytes())
使用.with_stem()
創(chuàng)建新的文件名,但沒有更改擴(kuò)展名,并使用.read_bytes()
讀取源文件的內(nèi)容,然后使用.write_bytes()
將這些內(nèi)容寫入目標(biāo)文件。
雖然使用 pathlib 來處理所有與路徑相關(guān)的事情很有吸引力,但你也可以考慮使用shutil
來復(fù)制文件。它是一個很好的選擇,也知道如何處理路徑對象。
檢查路徑是否符合規(guī)則
p = Path('data.json') # math 檢查匹配規(guī)則 print(p.match('*.json')) # True
轉(zhuǎn)Unix風(fēng)格
as_posix():返回使用正斜杠(/)的路徑字符串
from pathlib import Path path = Path('/host/share') print(str(path)) # \host\share print(path.as_posix()) # /host/share
pathlib 是否比 os.path 更快
在我嘗試運行基準(zhǔn)測試之前,我猜它不是。Path()
是一種面向?qū)ο蟮穆窂讲僮鞣椒?。實例化一個對象可能比調(diào)用os.path.join
(只需吐出一個字符串)更費時。
但即使慢,我也很好奇到底慢了多少。另外,誰知道呢,也許我的直覺是錯的?
廢話不多說,直接來看下路徑拼接的快慢對比:
#!usr/bin/env python # -*- coding:utf-8 _*- # __time__:2023/12/6 21:37 # pathlib_benchmarks.py import os from pathlib import Path def os_path_join(): return os.path.join("/", "how", "do", "you", "do", "hello", "world.txt") def pathlib_join(): return Path("/") / "how" / "do" / "you" / "do" / "hello" / "world.txt"
我們定義一個pathlib_benchmarks.py
的腳本,os_path_join
和pathlib_join
方法分別使用os.path
和path
模塊實現(xiàn),然后執(zhí)行測試:
PS E:\projects\mkwang\python_and_go> python -m timeit -s "from pathlib_benchmarks import pathlib_join" "pathlib_join()"
10000 loops, best of 5: 21.9 usec per loop
PS E:\projects\mkwang\python_and_go> python -m timeit -s "from pathlib_benchmarks import os_path_join" "os_path_join()"
50000 loops, best of 5: 6.95 usec per loop
結(jié)果和預(yù)期的差不太多!更多的對比,如果你有興趣的話可以自己試試~
常用腳本
統(tǒng)計文件個數(shù)
我們可以使用.iterdir
方法獲取當(dāng)前文件下的所有文件。
import pathlib from collections import Counter now_path = pathlib.Path.cwd() gen = (i.suffix for i in now_path.iterdir()) print(Counter(gen)) # Counter({'.py': 16, '': 11, '.txt': 1, '.png': 1, '.csv': 1})
查看目錄中最近修改的文件
from pathlib import Path from datetime import datetime directory = Path.cwd() time, file_path = max((f.stat().st_mtime, f) for f in directory.iterdir()) print(datetime.fromtimestamp(time), file_path) # 023-12-06 22:56:09.532177 E:\projects\mkwang\python_and_go\pathlib_test.py
移動子文件夾下的所有文件到本文件夾
from pathlib import Path current_file = Path(__file__).absolute() for path in Path('.').rglob('*'): if path == current_file or path.parent == Path('.'): continue if path.is_file(): try: new_path = Path('.') / path.name path.rename(new_path) except Exception as e: print(f"Error moving {path}: {e}")
展示目錄樹
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 import pathlib def print_tree(directory, depth=0): spacer = ' ' * depth print(f'{spacer}+ {directory.name}/') for path in sorted(directory.rglob('*')): if path.is_file(): print(f'{spacer} {path.name}') else: print_tree(path, depth + 1) if __name__ == '__main__': current_path = pathlib.Path.cwd() print_tree(current_path)
批量重命名
#! -*-conding=: UTF-8 -*- # 2023/12/6 11:41 from pathlib import Path def batch_rename(directory_path): directory = Path(directory_path) for file_path in directory.glob('*'): if file_path.is_file(): new_name = file_path.stem.split(' RAW')[0] + '.mp4' new_path = file_path.with_name(new_name) file_path.rename(new_path) if __name__ == '__main__': target_directory = './test' # 需要批量重命名的路徑 batch_rename(target_directory)
獲取文件大小
import os from pathlib import Path print(os.path.getsize('test/1.mp4')) print(Path('test/1.mp4').stat().st_size)
文件存在且不為空
from pathlib import Path def path_exists(path): """文件存在且不為空""" if path and Path(path).exists() and Path(path).stat().st_size > 0: return True return False print(path_exists('')) # False print(path_exists('abc.txt')) # False print(path_exists(__file__)) # True
小結(jié)
從 Python 3.4 開始,pathlib
已在標(biāo)準(zhǔn)庫中提供。創(chuàng)建、刪除、讀取、寫入、查找、移動、復(fù)制、拆分,以及其他任何你想對文件路徑或文件本身執(zhí)行的操作,pathlib 可能都有相應(yīng)的功能。使用pathlib,文件路徑可以由適當(dāng)?shù)?code>Path對象表示,而不是像以前一樣用純字符串表示。 這些對象使代碼處理文件路徑:
- 更容易閱讀,特別是可以使用 “/” 將路徑連接在一起
- 更強(qiáng)大,直接在對象上提供最必要的方法和屬性
- 在操作系統(tǒng)中更加一致,因為
Path
對象隱藏了不同系統(tǒng)的特性
當(dāng)然,os.path
或其他模塊可以更快地完成這些操作。
功能 | os 和 os.path | pathlib |
---|---|---|
絕對路徑 | os.path.abspath() | Path.resolve() |
改變文件的模式和權(quán)限 | os.chmod() | Path.chmod() |
新建目錄 | os.mkdir() | Path.mkdir() |
新建目錄 | os.makedirs() | Path.mkdir() |
重命名 | os.rename() | Path.rename() |
覆蓋 | os.replace() | Path.replace() |
刪除目錄 | os.rmdir() | Path.rmdir() |
移除此文件或符號鏈接 | os.remove(), os.unlink() | Path.unlink() |
當(dāng)前工作目錄 | os.getcwd() | Path.cwd() |
是否存在路徑 | os.path.exists() | Path.exists() |
根目錄 | os.path.expanduser() | Path.expanduser(), Path.home() |
列出路徑下的文件和目錄 | os.listdir() | Path.iterdir() |
是否為目錄 | os.path.isdir() | Path.is_dir() |
是否為文件 | os.path.isfile() | Path.is_file() |
是否指向符號鏈接 | os.path.islink() | Path.is_symlink() |
創(chuàng)建硬鏈接 | os.link() | Path.link_to() |
將此路徑創(chuàng)建為符號鏈接 | os.symlink() | Path.symlink_to() |
返回符號鏈接所指向的路徑 | os.readlink() | Path.readlink() |
返回 os.stat_result 對象包含此路徑信息 | os.stat() | Path.stat(), Path.owner(), Path.group() |
是否為絕對路徑 | os.path.isabs() | PurePath.is_absolute() |
連接路徑 | os.path.join() | PurePath.joinpath() |
文件名或目錄名 | os.path.basename() | PurePath.name |
父目錄 | os.path.dirname() | PurePath.parent |
是否相同文件 | os.path.samefile() | Path.samefile() |
文件名后綴 | os.path.splitext() | PurePath.suffix |
移動文件 | shutil.move() | Path.rename() |
以上就是Python使用pathlib庫實現(xiàn)優(yōu)雅的處理路徑的詳細(xì)內(nèi)容,更多關(guān)于Python pathlib處理路徑的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python docx的超鏈接網(wǎng)址和鏈接文本操作
這篇文章主要介紹了python docx的超鏈接網(wǎng)址和鏈接文本操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03Python Selenium 設(shè)置元素等待的三種方式
這篇文章主要介紹了Python Selenium 設(shè)置元素等待的三種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Python中關(guān)于字典的常規(guī)操作范例以及介紹
今天小編幫大家簡單介紹下Python的一種數(shù)據(jù)結(jié)構(gòu): 字典,字典是 Python 提供的一種常用的數(shù)據(jù)結(jié)構(gòu),它用于存放具有映射關(guān)系的數(shù)據(jù),通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下2021-09-09