官方文檔: pathlib — Object-oriented filesystem paths 一、基礎使用 遍歷子目錄 使用通配符遍歷文件 拼接路徑 獲取標準化後的絕對路徑 查詢路徑常規屬性 打開文件 from pathlib import Path print('1.1 查詢指定目錄的子目錄' ...
官方文檔: pathlib — Object-oriented filesystem paths
一、基礎使用
- 遍歷子目錄
- 使用通配符遍歷文件
- 拼接路徑
- 獲取標準化後的絕對路徑
- 查詢路徑常規屬性
- 打開文件
from pathlib import Path
print('1.1 查詢指定目錄的子目錄')
p = Path('D:/Envs')
print([sub_p for sub_p in p.iterdir() if sub_p.is_dir()])
print('1.2 使用通配符查詢目錄中的某類文件')
p = Path('D:/Envs/flask_env/Scripts')
# glob的結果是一個生成器,需要使用list進行轉換
print(list(p.glob('*.bat')))
print('1.3 拼接路徑,以下三種方式都可以')
p = Path('D:/Envs')
p = p / 'flask_env'
print(p)
p = p.joinpath('Scripts')
print(p)
p = p.joinpath(Path('activate.bat'))
print(p)
print('1.4 獲取絕對路徑,會自動消除符號鏈接使之稱為一個標準化的路徑表示,Windows中,斜杠會被轉換為反斜杠')
p = Path('.')
print(p.resolve())
print('1.5 查詢路徑常規屬性')
p = Path('D:/Envs')
print(p.exists())
print(p.is_dir())
print(p.is_file())
print('1.6 打開文件,以下兩種方式都可以')
p = Path('./test.txt')
with open(p) as f:
print(f.read())
with p.open() as f:
print(f.read())
1.1 查詢指定目錄的子目錄
[WindowsPath('D:/Envs/django_env'), WindowsPath('D:/Envs/flask_env'), WindowsPath('D:/Envs/study')]
1.2 使用通配符查詢目錄中的某類文件
[WindowsPath('D:/Envs/flask_env/Scripts/activate.bat'), WindowsPath('D:/Envs/flask_env/Scripts/deactivate.bat')]
1.3 拼接路徑,以下三種方式都可以
D:\Envs\flask_env
D:\Envs\flask_env\Scripts
D:\Envs\flask_env\Scripts\activate.bat
1.4 獲取絕對路徑,會自動消除符號鏈接使之成為一個標準化的路徑表示,Windows中,斜杠會被轉換為反斜杠
D:\Projects\pathlib_test
1.5 查詢路徑常規屬性
True
True
False
1.6 打開文件,以下兩種方式都可以
This is a test file
This is a test file
二、Pure paths
Pure paths在不對文件系統進行實際操作的前提下,提供了各種操作路徑的方法。該模塊提供了三個類PurePath、PureWindowsPath、PurePosixPath,從名稱可以看出PureWindowsPath用於Windows系統,PurePosixPath用於非Windows系統,當然也可以直接使用基類PurePath,從類定義上看,PureWindowsPath和PurePosixPath只是在 _flavour
上提前定義好了操作系統類型,直接使用PurePath會根據 os.name
自動識別當前操作系統。
註: 本章節示例來自官方文檔pathlib — Object-oriented filesystem paths
2.1 初始化
初始化時可以傳入一個或多個參數,參數可以是路徑字元串,也可以是 pathlib.Path
對象,若沒有傳入任何參數,則預設為當前目錄。
>>> PurePath('setup.py') # Running on a Unix machine
PurePosixPath('setup.py')
>>> PurePath('foo', 'some/path', 'bar')
PurePosixPath('foo/some/path/bar')
>>> PurePath(Path('foo'), Path('bar'))
PurePosixPath('foo/bar')
>>> PurePath()
PurePosixPath('.')
路徑中間的 //
和 .
會被自動優化。
>>> PurePath('foo//bar')
PurePosixPath('foo/bar')
>>> PurePath('//foo/bar')
PurePosixPath('//foo/bar')
>>> PurePath('foo/./bar')
PurePosixPath('foo/bar')
>>> PurePath('foo/../bar')
PurePosixPath('foo/../bar')
2.2 通用屬性
一個 PurePath
或 其子類,都可以直接用在任何實現了 os.PathLike 介面的地方,並且如果想要 PurePath
對象代表的路徑的字元串值,直接使用str即可。
>>> import os
>>> p = PurePath('/etc')
>>> os.fspath(p)
'/etc'
>>> p = PurePath('/etc')
>>> str(p)
'/etc'
>>> bytes(p)
b'/etc'
>>> p = PureWindowsPath('c:/Program Files')
>>> str(p)
'c:\\Program Files'
parts
屬性提供了根據路徑分隔符分隔的元組。
>>> p = PurePath('/usr/bin/python3')
>>> p.parts
('/', 'usr', 'bin', 'python3')
>>> p = PureWindowsPath('c:/Program Files/PSF')
>>> p.parts
('c:\\', 'Program Files', 'PSF')
2.3 其他方法和屬性
PurePath.drive
獲取路徑中的盤符(如果有),否則返回空字元串。
PurePath.anchor
PurePath.drive
和 PurePath.root
的結合。
>>> PureWindowsPath('c:/Program Files/').anchor
'c:\\'
>>> PureWindowsPath('c:Program Files/').anchor
'c:'
>>> PurePosixPath('/etc').anchor
'/'
>>> PureWindowsPath('//host/share').anchor # UNC shares
'\\\\host\\share\\'
PurePath.parents
返回一個存儲了各個祖先節點的不可變序列。在 Python 3.10 開始,支持對其切片以及使用負向索引。
>>> p = PureWindowsPath('c:/foo/bar/setup.py')
>>> p.parents[0]
PureWindowsPath('c:/foo/bar')
>>> p.parents[1]
PureWindowsPath('c:/foo')
>>> p.parents[2]
PureWindowsPath('c:/')
PurePath.parent
返回上一級路徑。註意,這個方法只是個“字元串上的切割”,不會查詢實際的路徑。
>>> p = PurePosixPath('/a/b/c/d')
>>> p.parent
PurePosixPath('/a/b/c')
>>> p = PurePosixPath('foo/..') # 如果想要實際的路徑信息,可以使用Path對象,先調用Path.resolve()獲取絕對路徑
>>> p.parent
PurePosixPath('foo')
PurePath.name
按路徑分割後,返回最後一級名稱(會自動去除盤符 drive
和根路徑符 root
)。
PurePosixPath('my/library/setup.py').name
'setup.py'
PurePath.suffix
返迴路徑中的文件名尾碼(如果有),如 .py
。
PurePath.suffixes
返迴路徑中最後一級的文件名尾碼列表(如果有),如“library.tar.gz”的suffixes值為 ['.tar', '.gz']
。
PurePath.stem
返迴路徑中最後一級的文件名(不含尾碼 PurePath.suffix
),如“library.tar.gz”的stem值為 library.tar
。
PurePath.as_posix()
返回以斜杠表示的路徑。
PurePath.is_absolute()
是否為絕對路徑。
PurePath.joinpath(*pathsegments)
拼接路徑,可以傳入一個或多個字元串或Path對象。
PurePath.match(pattern, *, case_sensitive=None)
判斷路徑是否符合指定通配符模式。 case_sensitive
參數( Python 3.12 增加)在Windows系統預設為False,其他系統預設為True。如果 pattern
也是PurePath對象,此方法匹配效率會更高。
>>> PurePath('a/b.py').match('*.py')
True
>>> PurePath('/a/b/c.py').match('b/*.py')
True
>>> PurePath('/a/b/c.py').match('a/*.py')
False
>>> pattern = PurePath('*.py')
>>> PurePath('a/b.py').match(pattern)
True
PurePath.with_name(name)
使用指定的name替換原有的name,如果原路徑就沒有name,則拋出異常。
>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_name('setup.py')
PureWindowsPath('c:/Downloads/setup.py')
>>> p = PureWindowsPath('c:/')
>>> p.with_name('setup.py')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name
raise ValueError("%r has an empty name" % (self,))
ValueError: PureWindowsPath('c:/') has an empty name
PurePath.with_stem(stem)
使用指定的stem替換原有的stem,如果原路徑就沒有stem,則拋出異常。
>>> p = PureWindowsPath('c:/Downloads/draft.txt')
>>> p.with_stem('final')
PureWindowsPath('c:/Downloads/final.txt')
>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_stem('lib')
PureWindowsPath('c:/Downloads/lib.gz')
>>> p = PureWindowsPath('c:/')
>>> p.with_stem('')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stem
return self.with_name(stem + self.suffix)
File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_name
raise ValueError("%r has an empty name" % (self,))
ValueError: PureWindowsPath('c:/') has an empty name
PurePath.with_suffix(suffix)
使用指定的尾碼(可以是空字元串)替換原有的尾碼,如果原路徑沒有尾碼,則會將尾碼添加到原路徑中。
>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_suffix('.bz2')
PureWindowsPath('c:/Downloads/pathlib.tar.bz2')
>>> p = PureWindowsPath('README')
>>> p.with_suffix('.txt')
PureWindowsPath('README.txt')
>>> p = PureWindowsPath('README.txt')
>>> p.with_suffix('')
PureWindowsPath('README')
三、path實體
path實體也提供了三個類Path(基類)、PosixPath、WindowsPath,Path繼承自PurePath,所以PurePath支持的操作,path實體的三個類也是支持的。path實體與pure path區別在於,path實體對象支持系統操作,如獲取絕對路徑、遍歷目錄的所有子目錄和文件、打開文件等,所以需要特別註意,在使用Path類時,可能會因為系統不支持導致拋出OSError等異常。
註: 本章節部分示例來自官方文檔pathlib — Object-oriented filesystem paths
3.1 常用方法
Path.cwd()
返回當前路徑,同 os.getcwd()
。
Path.home()
返回當前用戶的home目錄,同 os.path.expanduser()
。
Path.stat(*, follow_symlinks=True)
獲取路徑詳細信息,同 os.stat()
。 follow_symlinks
參數在 Python 3.10 開始添加。
>>> p = Path('setup.py')
>>> p.stat().st_size
956
>>> p.stat().st_mtime
1327883547.852554
Path.chmod(mode, *, follow_symlinks=True)
修改文件許可權,同 os.chmod()
。 follow_symlinks
參數在 Python 3.10 添加。
>>> p = Path('setup.py')
>>> p.stat().st_mode
33277
>>> p.chmod(0o444)
>>> p.stat().st_mode
33060
Path.exists(*, follow_symlinks=True)
檢查路徑是否存在。 follow_symlinks
參數在 Python 3.12 添加。
Path.expanduser()
返回填充了home目錄的路徑。該方法在 Python 3.5 添加。
>>> p = PosixPath('~/films/Monty Python')
>>> p.expanduser()
PosixPath('/home/eric/films/Monty Python')
Path.glob(pattern, *, case_sensitive=None)
使用通配符遍歷當前路徑下的所有目錄和文件。 case_sensitive
( Python 3.12 添加)預設為None,即使用當前系統的大小寫規則,也可手動指定。當 pattern
以路徑分隔符結尾,則只會列出目錄,不會列出文件(該特性在 Python 3.11 添加)。
>>> sorted(Path('.').glob('*.py'))
[PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]
>>> sorted(Path('.').glob('*/*.py'))
[PosixPath('docs/conf.py')]
>>> sorted(Path('.').glob('**/*.py'))
[PosixPath('build/lib/pathlib.py'),
PosixPath('docs/conf.py'),
PosixPath('pathlib.py'),
PosixPath('setup.py'),
PosixPath('test_pathlib.py')]
Path.group()
返迴路徑的屬組。
Path.is_dir()
檢查路徑是否是目錄。
Path.is_file()
檢查路徑是否是文件。
Path.is_junction()
檢查路徑是否是junction快捷方式(Windows系統專用)。
Path.is_mount()
判斷路徑是否是一個掛載點(該方法在 Python 3.7 添加,在 Python 3.12 支持Windows系統)。
Path.is_symlink()
判斷路徑是否是符號鏈接,如果路徑不存在也會返回False。
Path.is_socket()
檢查路徑是否指向Unix socket文件,如果路徑不存在也會返回False。
Path.is_fifo()
檢查路徑是否指向FIFO存儲,如果路徑不存在也會返回False。
Path.is_block_device()
檢查路徑是否指向塊設備,如果路徑不存在也會返回False。
Path.is_char_device()
檢查路徑是否指字元設備,如果路徑不存在也會返回False。
Path.iterdir()
以生成器的方式遍歷路徑下的所有目錄和文件。
Path.walk(top_down=True, on_error=None, follow_symlinks=False)
該方法在 Python 3.12 添加。遞歸遍歷指定路徑下的所有目錄和文件,使用時由生成器每次生成一個三元組(當前遍歷目錄,子目錄名列表,子文件名列表),想要使用某個子目錄或子文件時,其全路徑為“當前遍歷目錄+目錄名/文件名”。
top_down
預設為True,即從上到下遍歷,為False時表示從下到上遍歷,“上下”的區別就是從當前目錄的子目錄開始往最里一層一層遍歷遍歷,還是從最深的子目錄往外一層一層遍歷。on_error
預設為None,即忽略walk過程中的異常,也可手動指定一個可調用對象來處理異常,該對象的要求是接受發生的異常(OSError對象)。follow_symlinks
預設為False,即在walk時,不會自動跟蹤鏈接到真實的路徑,列出的結果就是鏈接本身(該操作區別於os.walk()
)。
示例:有路徑結構如下
test1
- test2
- test2.txt
- test1.txt
>>> import pathlib
>>> p = pathlib.Path('Z:\\Projects\\Daily Test\\pathlib_test\\test1')
>>> for root, dirnames, filenames in p.walk():
print(root)
print(dirnames)
print(filenames)
Z:\Projects\Daily Test\pathlib_test\test1
['test2']
['test1.txt']
Z:\Projects\Daily Test\pathlib_test\test1\test2
[]
['test2.txt']
>>>
>>> for root, dirnames, filenames in p.walk(top_down=False):
print(root)
print(dirnames)
print(filenames)
Z:\Projects\Daily Test\pathlib_test\test1\test2
[]
['test2.txt']
Z:\Projects\Daily Test\pathlib_test\test1
['test2']
['test1.txt']
Path.lchmod(mode)
類似 Path.chmod()
,修改文件許可權,區別在於,如果路徑是一個鏈接,則只會修改鏈接本身,而鏈接指向的對象不會被修改。
Path.lstat()
類似 Path.stat()
,修改文件屬性,區別在於,如果路徑是一個鏈接,則只會修改鏈接本身,而鏈接指向的對象不會被修改。
Path.mkdir(mode=0o777, parents=False, exist_ok=False)
創建目錄。 parents
預設False,表示路徑中的某個父目錄不存在則會拋錯, exist_ok
預設為False(該參數在 Python 3.5 添加),表示創建的路徑已經存在則會拋錯,這兩個參數的行為與POSIX系統中的 mkdir -p
命令執行一致。
Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
打開文件,同內置的open函數。
Path.owner()
返迴路徑的屬主。
Path.read_bytes()
以byte類型返迴文件的二進位內容。(該方法在 Python 3.5 添加)
Path.read_text(encoding=None, errors=None)
返回解碼後的文件文本內容。文件打開後會立即關閉,參數的行為與內置的open函數相同。(該方法在 Python 3.5 添加)
Path.readlink()
返回鏈接指向的真實文件的路徑,同 os.readlink()
。(該方法在 Python 3.9 添加)
Path.rename(target)
重命名文件或目錄,並返回新的路徑對象(返回值在 Python 3.8 添加)。在Unix是上靜默修改,在Windows上則會修改失敗。同 os.rename()
。
Path.replace(target)
替換一個已有的文件或目錄,並返回新的路徑對象(返回值在 Python 3.8 添加),如果待替換的路徑為已存在的文件或空目錄,則會強制替換。
Path.absolute()
返回絕對路徑,但不會自動標準化路徑,也不會自動解析符號鏈接。
Path.resolve(strict=False)
返回Path對象的絕對路徑,會自動消除符號鏈接、“.”、“..”等格式的路徑。當 strict=True
且文件路徑不存在時,則拋出異常。(該參數在 Python 3.6 添加,在這之前版本預設為True)
>>> p = Path()
>>> p
PosixPath('.')
>>> p.resolve()
PosixPath('/home/antoine/pathlib')
>>> p = Path('docs/../setup.py')
>>> p.resolve()
PosixPath('/home/antoine/pathlib/setup.py')
Path.rglob(pattern, *, case_sensitive=None)
按照給定通配符模式遞歸遍歷子目錄及文件。 pattern
參數若以路徑分隔符結尾,則只遍歷所有子目錄,不會遍歷文件(該規則在 Python 3.11 添加)。 case_sensitive
預設為None,即跟隨系統大小寫規則。(該參數在 Python 3.12 添加)。
Path.rmdir()
移除指定空目錄(非空目錄無法移除)。
Path.samefile(other_path)
判斷兩個文件是否相等, other_path
可以是Path對象,也可以是字元串。(該方法在 Python 3.5 添加)
Path.symlink_to(target, target_is_directory=False)
使當前Path對象成為一個符號鏈接,並指向 target
所表示的文件。 target_is_directory
參數在非Windows系統上會被忽略,不生效。
Path.hardlink_to(target)
使當前Path對象成為一個硬鏈接,並指向 target
所表示的文件。
Path.touch(mode=0o666, exist_ok=True)
創建一個路徑,如果 exist_ok=False
且路徑已經存在,則會拋出異常。
Path.unlink(missing_ok=False)
移除文件或符號鏈接。如果此Path對象指向的是目錄,請使用 Path.rmdir()
。 missing_ok
預設為False,即路徑不存在時拋出異常,反之則忽略異常。(該參數在 Python 3.8 添加)
Path.write_bytes(data)
以位元組模式打開文件並寫入位元組數據,寫入完成自動關閉文件。
Path.write_text(data, encoding=None, errors=None, newline=None)
以文本模式打開文件並寫入文本數據,同內置的open函數。(該方法在 Python 3.5 添加, newline
參數在 Python 3.10 添加)