最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python?pathlib庫(kù)的路徑/文件/目錄常用操作

 更新時(shí)間:2025年12月13日 11:50:50   作者:Dfreedom.  
pathlib 模塊提供了文件路徑對(duì)象抽象,不僅僅是替換os.path模塊對(duì)文件的操作,可以說(shuō)是路徑處理的好手,這篇文章主要介紹了基于Python?pathlib庫(kù)的路徑/文件/目錄常用操作的相關(guān)資料,需要的朋友可以參考下

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ō)明?:

  1. ?路徑對(duì)象與字符串?:獲取路徑列表的方法返回的是 pathlib.Path 對(duì)象列表,在進(jìn)行字符串操作(如判斷是否包含特定字符)時(shí),常需要使用 str(item) 轉(zhuǎn)換。若最終需要字符串路徑,可以這樣處理:[str(path) for path in path_list]。
  2. ?過(guò)濾邏輯?:logical 參數(shù)提供了靈活的篩選方式。例如,查找包含"報(bào)告"或"總結(jié)"的文件夾,可使用邏輯或;而查找同時(shí)包含"2024"和"月度報(bào)告"的文件夾,則需使用邏輯與。
  3. ?遞歸搜索?:使用 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)文章

最新評(píng)論

四会市| 拜城县| 卢龙县| 绥中县| 苏州市| 彰武县| 什邡市| 元谋县| 盈江县| 藁城市| 册亨县| 彰化县| 临朐县| 宁晋县| 河曲县| 康乐县| 神池县| 灵武市| 北海市| 金湖县| 莫力| 吐鲁番市| 二手房| 正安县| 双流县| 石首市| 石河子市| 安仁县| 巍山| 东明县| 三原县| 辽源市| 万年县| 霞浦县| 泸西县| 尉犁县| 绥德县| 循化| 禄劝| 西平县| 黎川县|