基于Python?pathlib庫(kù)的路徑/文件/目錄常用操作
1 pathlib 庫(kù)簡(jiǎn)介
pathlib 是 Python 3.4 及更高版本中的標(biāo)準(zhǔn)庫(kù),它采用面向?qū)ο蟮姆椒?/strong>來(lái)處理文件系統(tǒng)路徑。與傳統(tǒng)的 os.path 模塊不同,pathlib 將路徑表示為對(duì)象而不是字符串,使得路徑操作更加直觀和 Pythonic。
1.1 為什么要使用 pathlib?
傳統(tǒng)上,Python 使用 os.path 模塊處理路徑,它將路徑作為字符串處理,這種方式存在一些問(wèn)題:
- 操作分散在不同模塊(os、os.path、glob、shutil 等)
- 代碼跨平臺(tái)兼容性差
- 路徑操作不夠直觀
pathlib 解決了這些問(wèn)題,它提供?統(tǒng)一的 API?,支持跨平臺(tái)路徑處理,并且代碼更易讀。
2 基本操作介紹
2.1 路徑操作
2.1.1 導(dǎo)入和創(chuàng)建 Path 對(duì)象
from pathlib import Path
# 創(chuàng)建Path對(duì)象的幾種方式
current_path = Path() # 當(dāng)前目錄
relative_path = Path('folder/subfolder') # 相對(duì)路徑
absolute_path = Path('/home/user/documents') # 絕對(duì)路徑(Linux/Mac)
windows_path = Path('C:/Users/Name/Documents') # 絕對(duì)路徑(Windows)
# 使用類(lèi)方法
current_dir = Path.cwd() # 當(dāng)前工作目錄
home_dir = Path.home() # 用戶主目錄
2.1.2 路徑拼接和解析
pathlib 使用斜杠運(yùn)算符 / 來(lái)拼接路徑,這比傳統(tǒng)的 os.path.join() 更直觀:
# 路徑拼接
base_dir = Path('/base/demo')
sub_path = base_dir / 'subfolder' / 'file.txt'
print(sub_path) # 輸出: /base/demo/subfolder/file.txt
# 解析路徑組成部分
path = Path('D:/Users/base_demo/demo.py')
print(path.name) # 文件名(含后綴): demo.py
print(path.stem) # 文件名(不含后綴): demo
print(path.suffix) # 文件后綴: .py
print(path.parent) # 父目錄: D:/Users/base_demo
print(path.anchor) # 錨點(diǎn)(驅(qū)動(dòng)器): D:
2.1.3 路徑判斷和解析
path = Path('/path/to/file.txt')
# 路徑判斷
print(path.exists()) # 路徑是否存在
print(path.is_file()) # 是否是文件
print(path.is_dir()) # 是否是目錄
print(path.is_absolute()) # 是否是絕對(duì)路徑
# 路徑解析
print(path.resolve()) # 獲取絕對(duì)路徑,解析任何符號(hào)鏈接
print(path.as_uri()) # 將路徑表示為file URL
2.2 目錄操作
2.2.1 創(chuàng)建和刪除目錄
# 創(chuàng)建目錄
new_dir = Path('new_directory')
new_dir.mkdir(exist_ok=True) # exist_ok=True表示目錄已存在時(shí)不報(bào)錯(cuò)
# 創(chuàng)建多級(jí)目錄
deep_dir = Path('path/to/deep/directory')
deep_dir.mkdir(parents=True, exist_ok=True) # parents=True創(chuàng)建所有必要的父目錄
# 刪除目錄(目錄必須為空)
empty_dir = Path('empty_directory')
empty_dir.rmdir()
2.2.2 遍歷目錄內(nèi)容
path = Path('.')
# 遍歷直接子項(xiàng)
for item in path.iterdir():
if item.is_file():
print(f"文件: {item.name}")
elif item.is_dir():
print(f"目錄: {item.name}")
# 使用glob模式匹配
for py_file in path.glob('*.py'):
print(f"Python文件: {py_file}")
# 遞歸匹配(搜索子目錄)
for py_file in path.rglob('*.py'):
print(f"Python文件: {py_file}")
2.3 文件操作
2.3.1 文件讀寫(xiě)
pathlib 提供了便捷的文件讀寫(xiě)方法:
file_path = Path('example.txt')
# 寫(xiě)入文件
file_path.write_text('Hello, World!') # 寫(xiě)入文本
# 讀取文件
content = file_path.read_text()
print(content)
# 二進(jìn)制讀寫(xiě)
data = b'Binary data'
file_path.write_bytes(data) # 寫(xiě)入二進(jìn)制數(shù)據(jù)
binary_content = file_path.read_bytes() # 讀取二進(jìn)制數(shù)據(jù)
# 使用open方法(更細(xì)粒度的控制)
with file_path.open('a') as f: # 追加模式
f.write('\nAppended text')
2.3.2 文件屬性和操作
file_path = Path('example.txt')
# 獲取文件屬性
stat_info = file_path.stat()
print(f"文件大小: {stat_info.st_size} 字節(jié)")
print(f"創(chuàng)建時(shí)間: {stat_info.st_ctime}")
print(f"修改時(shí)間: {stat_info.st_mtime}")
# 文件操作
new_path = file_path.rename('new_name.txt') # 重命名
copied_path = new_path.replace('backup.txt') # 移動(dòng)/復(fù)制(會(huì)覆蓋已存在文件)
# 刪除文件
file_path.unlink(missing_ok=True) # missing_ok=True表示文件不存在時(shí)不報(bào)錯(cuò)
2.4 匯總
| 操作類(lèi)別 | 具體操作 | pathlib方法/示例 | 關(guān)鍵點(diǎn)/注意事項(xiàng) |
|---|---|---|---|
| 路徑操作 | 創(chuàng)建路徑對(duì)象 | Path("folder/file.txt"), Path.cwd() / "subdir" / "file.txt" | 使用/運(yùn)算符拼接路徑,直觀且跨平臺(tái)。 |
| 路徑操作 | 獲取路徑組成部分 | path.name (文件名)path.parent (父目錄)path.suffix (擴(kuò)展名)path.stem (無(wú)擴(kuò)展名的文件名) | 這些是屬性,直接調(diào)用即可。 |
| 路徑操作 | 路徑分解與拼接 | path.parts (分解為元組)path.joinpath("sub", "file.txt") (拼接) | parts屬性便于分析路徑結(jié)構(gòu)。 |
| 路徑操作 | 檢查路徑屬性 | path.exists() (存在性)path.is_file() (是文件)path.is_dir() (是目錄)path.is_absolute() (是絕對(duì)路徑) | 在進(jìn)行操作前進(jìn)行檢查可使代碼更健壯。 |
| 路徑操作 | 轉(zhuǎn)換路徑 | path.absolute() (絕對(duì)路徑)path.resolve() (絕對(duì)路徑并解析符號(hào)鏈接) | resolve()會(huì)消除路徑中的"…"等符號(hào)。 |
| 文件操作 | 創(chuàng)建文件 | path.touch() | 如果文件已存在,touch會(huì)更新其修改時(shí)間。也可用于創(chuàng)建空文件。 |
| 文件操作 | 讀取文件內(nèi)容 | path.read_text(encoding="utf-8")``path.read_bytes() | 一次性讀取全部?jī)?nèi)容。對(duì)于大文件,建議使用open方式逐行讀取。 |
| 文件操作 | 寫(xiě)入文件內(nèi)容 | path.write_text("content", encoding="utf-8")``path.write_bytes(data) | 會(huì)覆蓋文件原有內(nèi)容。若需追加,需使用open模式。 |
| 文件操作 | 復(fù)制文件 | shutil.copy(src, dst)``shutil.copy2(src, dst) | 復(fù)制文件。創(chuàng)建源文件的一個(gè)副本,原始文件保留。shutil.copy2復(fù)制文件內(nèi)容及所有元數(shù)據(jù)(如創(chuàng)建時(shí)間、修改時(shí)間)。 |
| 文件操作 | 移動(dòng)/重命名文件 | shutil.move(src, dst) | 移動(dòng)/重命名文件或目錄。原始文件在操作后會(huì)被刪除。 |
| 文件操作 | 刪除文件 | path.unlink(missing_ok=False) | 設(shè)置missing_ok=True時(shí),若文件不存在則忽略錯(cuò)誤。 |
| 目錄操作 | 創(chuàng)建目錄(單級(jí)) | path.mkdir() | 默認(rèn)只能創(chuàng)建末級(jí)目錄,若父目錄不存在會(huì)報(bào)錯(cuò)。 |
| 目錄操作 | 創(chuàng)建目錄(多級(jí)) | path.mkdir(parents=True, exist_ok=True) | parents=True創(chuàng)建父目錄;exist_ok=True忽略目錄已存在的情況。 |
| 目錄操作 | 刪除目錄 | path.rmdir() | 只能刪除空目錄。 |
| 目錄操作 | 遍歷目錄內(nèi)容 | for item in path.iterdir(): | 返回一個(gè)生成器,包含該目錄下的所有文件和子目錄的Path對(duì)象。 |
| 目錄操作 | 遞歸遍歷與文件匹配 | for file in path.glob("*.txt"): (當(dāng)前目錄)for file in path.rglob("*.txt"): (遞歸所有子目錄) | 使用通配符模式匹配文件,非常強(qiáng)大。 |
| 獲取信息 | 獲取文件狀態(tài)信息 | path.stat() | 返回一個(gè)包含文件大?。╯t_size)、修改時(shí)間(st_mtime)等詳細(xì)信息的對(duì)象。 |
3 常用場(chǎng)景演示
3.1 常用場(chǎng)景羅列
| 場(chǎng)景類(lèi)別 | 場(chǎng)景描述 | 預(yù)期輸出 |
|---|---|---|
| 文件夾列表獲取 | 獲取直接子文件夾名稱(chēng) | 返回直接子文件夾的名稱(chēng)列表 |
| 獲取所有子文件夾路徑 | 返回所有子文件夾的 Path 對(duì)象列表 | |
| 文件列表獲取 | 獲取直接子文件名稱(chēng)(含擴(kuò)展名) | 返回直接子文件的名稱(chēng)列表(帶后綴) |
| 獲取所有子文件名稱(chēng)(無(wú)擴(kuò)展名) | 返回所有子文件的名稱(chēng)列表(無(wú)后綴) | |
| 獲取所有子文件路徑 | 返回所有子文件的 Path 對(duì)象列表 | |
| 條件篩選 | 按字符串邏輯與(AND)篩選文件夾路徑 | 返回滿足所有篩選條件的文件夾路徑列表 |
| 按字符串邏輯或(OR)篩選文件路徑 | 返回滿足任一篩選條件的文件路徑列表 | |
| 文件夾操作 | 清空目標(biāo)文件夾 | 刪除目標(biāo)文件夾內(nèi)所有內(nèi)容并重建空文件夾 |
| 復(fù)制目錄結(jié)構(gòu) | 在目標(biāo)位置創(chuàng)建與源目錄相同的空文件夾結(jié)構(gòu) | |
| 查找葉子目錄 | 返回不包含任何子目錄的最底層目錄(葉子目錄)列表 | |
| 文件操作 | 復(fù)制指定格式文件 | 將源目錄(及子目錄)中所有指定格式的文件復(fù)制到目標(biāo)文件夾 |
| 復(fù)制目錄和文件 | 先復(fù)制目錄結(jié)構(gòu),再將指定格式的文件復(fù)制到對(duì)應(yīng)目錄 | |
| 復(fù)制并重命名文件 | 將文件復(fù)制到目標(biāo)文件夾,并按新名稱(chēng)保存(保留原擴(kuò)展名) |
*使用技巧與說(shuō)明?:
- ?路徑對(duì)象與字符串?:獲取路徑列表的方法返回的是
pathlib.Path對(duì)象列表,在進(jìn)行字符串操作(如判斷是否包含特定字符)時(shí),常需要使用str(item)轉(zhuǎn)換。若最終需要字符串路徑,可以這樣處理:[str(path) for path in path_list]。 - ?過(guò)濾邏輯?:
logical參數(shù)提供了靈活的篩選方式。例如,查找包含"報(bào)告"或"總結(jié)"的文件夾,可使用邏輯或;而查找同時(shí)包含"2024"和"月度報(bào)告"的文件夾,則需使用邏輯與。 - ?遞歸搜索?:使用
rglob('*')的方法會(huì)遍歷指定路徑下的所有子目錄,適合需要對(duì)整個(gè)目錄樹(shù)進(jìn)行操作的場(chǎng)景。
3.2 匯總成一個(gè)類(lèi)+main()演示
下面是一個(gè)完整的 FileIO 類(lèi),封裝了常見(jiàn)的文件路徑操作,同時(shí)對(duì)3.1羅列的場(chǎng)景進(jìn)行了簡(jiǎn)單的示例:
from pathlib import Path
import shutil
import time
class FileIO:
"""
使用 pathlib 封裝常見(jiàn)文件路徑操作的實(shí)用類(lèi)
該類(lèi)提供了一系列用于文件和目錄操作的方法,包括遍歷、篩選、清空文件夾等功能。
所有路徑操作均基于 pathlib 庫(kù),確??缙脚_(tái)兼容性。
"""
def __init__(self, source_folder: None |str | Path, target_folder:None |str | Path) -> None:
"""
初始化 FileIO 實(shí)例
Args:
source_folder: 源目錄路徑,可以是字符串或 Path 對(duì)象
"""
self.source_folder = Path(source_folder) # 保證路徑是 Path 格式
self.target_folder = Path(target_folder) #目標(biāo)文件
if not self.target_folder.exists(): #目標(biāo)文件夾不存在時(shí),新建
self.target_folder.mkdir(parents=True, exist_ok=True)
def list_folder_names(self, recursive: bool = True) -> list[str]:
"""
獲取文件夾名稱(chēng)列表
Args:
recursive: 是否遞歸獲取所有子文件夾,默認(rèn)為 True
True - 遞歸獲取所有子文件夾
False - 只獲取直接子文件夾
Returns:
文件夾名稱(chēng)列表
"""
folder_path = self.source_folder
folder_names = [item.name
for item in (folder_path.rglob('*') if recursive else folder_path.iterdir()) #iterdir()比glob('*')更高效,
if item.is_dir()]
return folder_names
def list_folder_paths(self, recursive: bool = True) -> list[Path]:
"""
獲取文件夾路徑列表
Args:
recursive: 是否遞歸獲取所有子文件夾路徑
Returns:
Path 對(duì)象列表,包含所有匹配的文件夾路徑
"""
folder_path = self.source_folder
folder_paths = [item
for item in (folder_path.rglob('*') if recursive else folder_path.iterdir())
if item.is_dir()]
return folder_paths
def list_file_names(self, recursive: bool = True, include_extension: bool = True) -> list[str]:
"""
獲取文件名列表
Args:
recursive: 是否遞歸獲取所有子文件
include_extension: 是否包含文件擴(kuò)展名
True - 包含擴(kuò)展名 (e.g., "document.txt")
False - 不包含擴(kuò)展名 (e.g., "document")
Returns:
文件名列表
"""
folder_path = self.source_folder
file_names = [
item.name if include_extension else item.stem
for item in (folder_path.rglob('*') if recursive else folder_path.iterdir())
if item.is_file()
]
return file_names
def list_file_paths(self, recursive: bool = True) -> list[Path]:
"""
獲取文件路徑列表
Args:
recursive: 是否遞歸獲取所有子文件路徑
Returns:
Path 對(duì)象列表,包含所有匹配的文件路徑
"""
folder_path = self.source_folder
file_paths = [item
for item in (folder_path.rglob('*') if recursive else folder_path.iterdir())
if item.is_file()]
return file_paths
@staticmethod
def filter_by_strings(items: list[str] | list[Path], target_strings: list[str], logical_or: bool = True) -> list[str]:
"""
根據(jù)字符串列表篩選項(xiàng)目
Args:
items: 要篩選的項(xiàng)目列表
target_strings: 目標(biāo)字符串列表,用于篩選條件
logical_or: 邏輯操作類(lèi)型
True - 邏輯或(包含任意一個(gè)目標(biāo)字符串即匹配)
False - 邏輯與(包含所有目標(biāo)字符串才匹配)
Returns:
篩選后的項(xiàng)目列表
"""
if logical_or: # 邏輯OR:包含任意一個(gè)字符串即可
filtered_items = [item
for item in items
if any(target_str in str(item) for target_str in target_strings)
]
else: # 邏輯AND:包含所有字符串
filtered_items = [item
for item in items
if all(target_str in str(item) for target_str in target_strings)
]
return filtered_items
@staticmethod
def clear_folder(target_dir: str|Path, max_attempts: int = 3, delay_seconds: float = 3) -> bool|None:
"""
通過(guò)刪除并重建文件夾的方式來(lái)清空目標(biāo)文件夾,支持重試機(jī)制
Args:
max_attempts: 最大嘗試次數(shù),默認(rèn)為3次
delay_seconds: 每次重試前的等待時(shí)間(秒),默認(rèn)為3秒
Returns:
bool: 成功清空返回 True,失敗返回 False
Raises:
PermissionError: 當(dāng)文件被占用且無(wú)法刪除時(shí)
OSError: 當(dāng)發(fā)生其他操作系統(tǒng)錯(cuò)誤時(shí)
"""
attempts = 0
while attempts < max_attempts:
try:
# 嘗試清空文件夾的核心邏輯
source_folder = Path(target_dir)
if source_folder.exists():
shutil.rmtree(source_folder) # 遞歸刪除整個(gè)文件夾
# 短暫延遲確保刪除完全生效
time.sleep(0.05)
source_folder.mkdir(exist_ok=True) # 重新創(chuàng)建空文件夾
print(f"成功清空文件夾: {source_folder}")
return True
except PermissionError as error:
# 捕獲權(quán)限錯(cuò)誤(通常是因?yàn)槲募徽加茫?
attempts += 1
print(f"嘗試 {attempts}/{max_attempts} 失敗: 文件可能正被其他程序占用。錯(cuò)誤信息: {error}")
if attempts < max_attempts:
print(f"等待 {delay_seconds} 秒后重試...")
time.sleep(delay_seconds)
else:
print(f"已達(dá)到最大重試次數(shù) {max_attempts},無(wú)法清空文件夾。")
return False
except OSError as error:
# 捕獲其他操作系統(tǒng)錯(cuò)誤,例如路徑無(wú)效等
print(f"發(fā)生操作系統(tǒng)錯(cuò)誤: {error}")
return False
def copy_directory_structure(self, recursive: bool = True) -> None:
"""
復(fù)制源目錄結(jié)構(gòu)到目標(biāo)位置(不復(fù)制文件內(nèi)容)
遞歸復(fù)制源目錄下的所有子目錄結(jié)構(gòu)到目標(biāo)位置,但不會(huì)復(fù)制任何文件內(nèi)容,
只創(chuàng)建空的目錄結(jié)構(gòu)。
Args:
target_dir: 目標(biāo)目錄路徑,可以是字符串或 Path 對(duì)象
"""
source_path = self.source_folder
target_path = self.target_folder
# 確保目標(biāo)根目錄存在
target_path.mkdir(parents=True, exist_ok=True)
# 使用 rglob 遞歸遍歷源目錄下的所有子目錄
for dir_path in (source_path.rglob('*') if recursive else source_path.glob('*')):
if dir_path.is_dir():
# 計(jì)算當(dāng)前目錄相對(duì)于源目錄的相對(duì)路徑
try:
relative_path = dir_path.relative_to(source_path)
except ValueError:
# 如果 dir_path 不是 source_path 的子路徑,跳過(guò)
continue
# 構(gòu)建目標(biāo)目錄路徑并創(chuàng)建
target_subdir = target_path / relative_path
target_subdir.mkdir(parents=True, exist_ok=True)
print(f"創(chuàng)建目錄: {target_subdir}")
def find_leaf_directories(self) -> list[Path]:
"""
查找并返回所有葉子目錄(不包含子目錄的目錄)
Returns:
葉子目錄的 Path 對(duì)象列表
"""
source_path = self.source_folder
leaf_directories = []
# 識(shí)別葉子目錄:沒(méi)有子目錄的目錄就是葉子目錄
for dir_path in source_path.rglob('*'):
if dir_path.is_dir():
# 檢查當(dāng)前目錄是否包含子目錄
has_subdirectories = any(item.is_dir() for item in dir_path.iterdir())
if not has_subdirectories:
leaf_directories.append(dir_path)
# 輸出所有葉子目錄信息
result_paths = []
print("\n所有葉子目錄(最深層次的子目錄):")
for leaf_path in leaf_directories:
# 計(jì)算相對(duì)于源目錄的路徑用于顯示
try:
relative_leaf_path = leaf_path.relative_to(source_path)
result_paths.append(source_path / relative_leaf_path)
# 計(jì)算目錄深度
depth = len(relative_leaf_path.parts)
print(f"- {relative_leaf_path} (深度: {depth})")
except ValueError:
# 如果路徑計(jì)算出錯(cuò),跳過(guò)
continue
return result_paths
#將一個(gè)文件夾里的所有指定格式文件復(fù)制到另一個(gè)目標(biāo)文件夾
def copy_files(self, file_extension='.tif') -> None:
source_files = self.list_file_paths(True) #獲取原始文件夾里所有的文件路徑
for source_file in source_files:
if file_extension in str(source_file):
shutil.copy2(source_file, self.target_folder)#將原始文件夾里所有的文件復(fù)制到對(duì)應(yīng)文件夾
print(f"已復(fù)制: {source_file} -> {target_folder}")
#將一個(gè)文件夾里的所有目錄和指定格式文件復(fù)制到另一個(gè)文件夾
def copy_folders_and_files(self, file_extension='.tif') -> None:
self.copy_directory_structure(True)
source_files = self.list_file_paths(True) # 獲取原始文件夾里所有的文件路徑
for source_file in source_files:
if file_extension in str(source_file):
# 計(jì)算 source_file 相對(duì)于 self.source_folder 的相對(duì)路徑
relative_path = source_file.relative_to(self.source_folder)
# 將相對(duì)路徑拼接到目標(biāo)文件夾下
target_file = self.target_folder / relative_path
shutil.copy2(source_file, target_file) # 將原始文件夾里所有的文件復(fù)制到對(duì)應(yīng)文件夾
print(f"已復(fù)制: {source_file} -> {target_file}")
#將一個(gè)文件復(fù)制到目標(biāo)文件夾里,并重命名
@staticmethod
def copy_rename_file(source_file_path:str|Path, target_folder:str|Path,new_filename:str) -> None:
extension_name = Path(source_file_path).suffix
target_file_path = Path(target_folder) / Path(new_filename +extension_name)
shutil.copy2(source_file_path, target_file_path)
print(f"已復(fù)制: {source_file_path} -> {target_file_path}")
if __name__ == '__main__':
# # 測(cè)試路徑,請(qǐng)?zhí)鎿Q為實(shí)際路徑
source_folder = Path(r"F:\source")
target_folder = Path(r"F:\target")
file_io = FileIO(source_folder, target_folder) # 實(shí)例化類(lèi)
target_strings = [".tif", ".docx"]
#
# 測(cè)試直接子文件夾相關(guān)方法
print("=== 直接子文件夾 ===")
current_folder_names = file_io.list_folder_names(False) #獲取直接文件夾名
current_folder_paths = file_io.list_folder_paths(False) #獲取直接文件夾路徑
filtered_current_folder_paths_and = file_io.filter_by_strings(current_folder_paths, target_strings, False) #按照邏輯與篩選含所有關(guān)鍵字的直接子文件夾路徑
filtered_current_folder_paths_or = file_io.filter_by_strings(current_folder_paths, target_strings, True) #按照邏輯或篩選含任一關(guān)鍵字的直接子文件夾路徑
print("直接子文件夾名稱(chēng)列表:", current_folder_names)
print("直接子文件夾路徑列表:", current_folder_paths)
print("AND條件過(guò)濾的文件夾:", filtered_current_folder_paths_and)
print("OR條件過(guò)濾的文件夾:", filtered_current_folder_paths_or)
# 測(cè)試所有子文件夾相關(guān)方法
print("\n=== 所有子文件夾 ===")
all_folder_names = file_io.list_folder_names(True) #獲取所有子文件夾名
all_folder_paths = file_io.list_folder_paths(True) #獲取所有子文件夾路徑
filtered_all_folder_paths_and = file_io.filter_by_strings(all_folder_paths, target_strings, False) #按照邏輯與篩選含所有關(guān)鍵字的子文件夾路徑
filtered_all_folder_paths_or = file_io.filter_by_strings(all_folder_paths, target_strings, True) #按照邏輯或篩選含任一關(guān)鍵字的子文件夾路徑
print("所有子文件夾名稱(chēng):", all_folder_names)
print("所有子文件夾路徑:", all_folder_paths)
print("AND條件過(guò)濾的所有子文件夾:", filtered_all_folder_paths_and)
print("OR條件過(guò)濾的所有子文件夾:", filtered_all_folder_paths_or )
# 測(cè)試直接子文件相關(guān)方法
print("\n=== 直接子文件 ===")
current_file_lists_with_extension = file_io.list_file_names(False,True) #獲取所有直接文件的名稱(chēng),有擴(kuò)展名
current_file_lists_no_extension = file_io.list_file_names(False,False) #獲取所有直接文件的名稱(chēng),無(wú)擴(kuò)展名
current_file_path_lists = file_io.list_file_paths(False) #獲取直接文件路徑
filtered_file_path_lists_and = file_io.filter_by_strings(current_file_path_lists, target_strings, False) #按照邏輯與篩選含所有關(guān)鍵字的直接子文件路徑
filtered_file_path_lists_or = file_io.filter_by_strings(current_file_path_lists, target_strings, True) #按照邏輯或篩選含任一關(guān)鍵字的直接子文件路徑
print("帶擴(kuò)展名的文件:", current_file_lists_with_extension)
print("不帶擴(kuò)展名的文件:", current_file_lists_no_extension)
print("文件路徑列表:", current_file_path_lists )
print("AND條件過(guò)濾的文件:", filtered_file_path_lists_and)
print("OR條件過(guò)濾的文件:", filtered_file_path_lists_or)
# 測(cè)試所有子文件相關(guān)方法
print("\n=== 所有子文件 ===")
all_file_lists_with_extension = file_io.list_file_names(True,True) #獲取所有文件的名稱(chēng),有擴(kuò)展名
all_file_lists_no_extension = file_io.list_file_names(True,False) #獲取所有文件的名稱(chēng),無(wú)擴(kuò)展名
all_file_path_lists = file_io.list_file_paths(True) #獲取所有文件路徑
filtered_all_file_path_lists_and = file_io.filter_by_strings(all_file_path_lists, target_strings, False) #按照邏輯與篩選含所有關(guān)鍵字的所有文件路徑
filtered_all_file_path_lists_or = file_io.filter_by_strings(all_file_path_lists, target_strings, True) #按照邏輯或篩選含任一關(guān)鍵字的所有文件路徑
print("所有文件(帶擴(kuò)展名):", all_file_lists_with_extension)
print("所有文件(不帶擴(kuò)展名):", all_file_lists_no_extension)
print("所有文件路徑:", all_file_path_lists)
print("AND條件過(guò)濾的所有文件:", filtered_all_file_path_lists_and)
print("OR條件過(guò)濾的所有文件:", filtered_all_file_path_lists_or)
#清空目標(biāo)文件夾里的所有內(nèi)容
file_io.clear_folder(file_io.target_folder)
#復(fù)制所有目錄
file_io.copy_directory_structure(True) #True,復(fù)制所有目錄,F(xiàn)alse,復(fù)制當(dāng)前目錄
#找到所有葉子目錄
all_leaves = file_io.find_leaf_directories()
print(all_leaves)
# 清空目標(biāo)文件夾里的所有內(nèi)容
file_io.clear_folder(file_io.target_folder)
#復(fù)制特定格式的文件到指定目錄
file_io.copy_files(".docx")
# 清空目標(biāo)文件夾里的所有內(nèi)容
file_io.clear_folder(file_io.target_folder)
#復(fù)制并重命名
i=0
for filtered_all_file_path_lists_or in filtered_all_file_path_lists_or:
file_io.copy_rename_file(filtered_all_file_path_lists_or,file_io.target_folder,str(i))
i = i + 1
5 pathlib 與傳統(tǒng) os.path 的對(duì)比
pathlib 相比傳統(tǒng) os.path 操作有明顯優(yōu)勢(shì):
| 操作 | os.path (傳統(tǒng)方式) | pathlib (現(xiàn)代方式) |
|---|---|---|
| 路徑拼接 | os.path.join('dir', 'subdir', 'file.txt') | Path('dir') / 'subdir' / 'file.txt' |
| 獲取文件名 | os.path.basename(path) | path.name |
| 獲取父目錄 | os.path.dirname(path) | path.parent |
| 檢查存在 | os.path.exists(path) | path.exists() |
| 判斷文件 | os.path.isfile(path) | path.is_file() |
| 判斷目錄 | os.path.isdir(path) | path.is_dir() |
pathlib 的面向?qū)ο蠓绞绞勾a?更簡(jiǎn)潔、更易讀?,而且自動(dòng)處理操作系統(tǒng)差異,提高代碼的可移植性。
6 總結(jié)
pathlib 庫(kù)提供了一種現(xiàn)代化、面向?qū)ο?/strong>的方法來(lái)處理文件系統(tǒng)路徑,比傳統(tǒng)的 os.path 模塊更直觀和強(qiáng)大。通過(guò) Path 對(duì)象,我們可以用更簡(jiǎn)潔的語(yǔ)法完成復(fù)雜的路徑操作,同時(shí)自動(dòng)處理不同操作系統(tǒng)的路徑差異。
關(guān)鍵優(yōu)勢(shì)包括:
- 直觀的路徑拼接操作(使用
/運(yùn)算符) - 豐富的路徑解析方法(name、stem、suffix、parent 等)
- 便捷的文件系統(tǒng)操作(讀寫(xiě)文件、目錄遍歷等)
- 更好的跨平臺(tái)兼容性
- 更 Pythonic 的 API 設(shè)計(jì)
對(duì)于新項(xiàng)目,建議直接使用 pathlib 處理所有文件路徑操作,這將使代碼更簡(jiǎn)潔、更易維護(hù)。
到此這篇關(guān)于基于Python pathlib庫(kù)的路徑/文件/目錄常用操作的文章就介紹到這了,更多相關(guān)Python pathlib庫(kù)路徑/文件/目錄操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python抖音快手代碼舞(字符舞)的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Python抖音快手代碼舞的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5菜單欄控件QMenuBar的詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5菜單欄控件QMenuBar的詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-02-02
編寫(xiě)Python腳本來(lái)實(shí)現(xiàn)最簡(jiǎn)單的FTP下載的教程
這篇文章主要介紹了編寫(xiě)Python腳本來(lái)實(shí)現(xiàn)最簡(jiǎn)單的FTP下載的教程,主要用到了ftplib模塊,無(wú)圖形界面...需要的朋友可以參考下2015-05-05
Python利用Requests庫(kù)實(shí)現(xiàn)XML文檔解析并提取摘要
本文詳細(xì)闡述了如何組合requests、urllib3.Retry和lxml構(gòu)建一個(gè)穩(wěn)定高效的XML文檔抓取與摘要流水線,文中的示例代碼講解詳細(xì),有需要的小伙伴可以了解下2026-03-03
python實(shí)現(xiàn)自動(dòng)解數(shù)獨(dú)小程序
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)自動(dòng)解數(shù)獨(dú)小程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
python中使用時(shí)間戳timestamp問(wèn)題
文章介紹了Python中使用時(shí)間戳和時(shí)間模塊的操作,包括獲取當(dāng)前時(shí)間、計(jì)算程序運(yùn)行時(shí)間以及時(shí)間戳與時(shí)間字符串之間的轉(zhuǎn)換2025-02-02
基于Pydantic封裝的通用模型在API請(qǐng)求驗(yàn)證中的應(yīng)用詳解
這篇文章主要介紹了基于Pydantic封裝的通用模型在API請(qǐng)求驗(yàn)證中的應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2023-05-05
Python爬蟲(chóng)設(shè)置代理IP(圖文)
在本篇內(nèi)容里小編給大家分享了關(guān)于Python爬蟲(chóng)設(shè)置代理IP的相關(guān)知識(shí)點(diǎn)和步驟,需要的朋友們參考下。2018-12-12

