python pathlib模塊詳解


借鑒於 pathlib 官方文檔 用於自己學習和記錄
使用 pathlib 模塊基本可以代替 os.path 來處理路徑。它采用了完全面向對象的編程方式。
其包含六個類,圖片如下:

但是大體有兩類:

  • pure paths 路徑計算操作沒有IO功能
  • concrete paths 路徑計算操作和IO功能

從上圖可以看出:PurePath 類是所有類的基類

基礎使用

列出子目錄
>>> p = Path('.')
>>> [x for x in p.iterdir() if x.is_dir()]
[PosixPath('.hg'), PosixPath('docs'), PosixPath('dist'),
 PosixPath('__pycache__'), PosixPath('build')]

###### 列出指定類型的文件
list(p.glob('**/*.py'))

###### 路徑拼接 在目錄樹中移動 使用`/`來拼接路徑 ```python >>> p = Path('/etc') >>> q = p / 'init.d' / 'reboot' >>> q WindowsPath('/etc/init.d/reboot') >>> q.resolve() WindowsPath('C:/etc/init.d/reboot') >>> print(q) \etc\init.d\reboot >>> print(q.resolve()) C:\etc\init.d\reboot >>> ```

###### 查詢路徑的屬性 ```python >>> q.exists() # Unix 里面這個會返回True False >>> q.is_dir() False >>> ```
###### 打開一個文件 ```python >>> with q.open() as f: f.readline() ... FileNotFoundError: [Errno 2] No such file or directory # 如果不存在則報錯 ```
#### Pure paths 純路徑 純路徑對象提供了 不實際訪問文件系統的路徑處理操作。有三種方式來訪問這些類。
###### class pathlib.** PurePath(\*pathsegments)**
>>> PurePath('setup.py')      
PurePosixPath('setup.py')  # Running on a Unix machine
PureWindowsPath('setup.py')  # Running on a Windows machine
# 也可以用以下方式添加路徑
>>> PurePath('foo', 'some/path', 'bar')
PurePosixPath('foo/some/path/bar')  # Running on a Unix machine
PureWindowsPath('foo/some/path/bar')  # Running on a Windows machine
>>> PurePath(Path('foo'), Path('bar'))
PurePosixPath('foo/bar')  # Running on a Unix machine
PureWindowsPath('foo/bar')  # Running on a Windows machine

參數為空時,返回當前路徑

>>> PurePath()
PurePosixPath('.')  # Running on a Unix machine
PureWindowsPath('.')  # Running on a Windows machine

當同時指定多個絕對路徑,則使用最后一個

>>> PurePath('/etc', '/usr', 'lib64')
PurePosixPath('/usr/lib64')
>>> PureWindowsPath('c:/Windows', 'd:bar')
PureWindowsPath('d:bar')

在 Windows 路徑中,改變本地根目錄並不會丟棄之前盤符的設置

>>> PureWindowsPath('c:/Windows', '/Program Files')
PureWindowsPath('c:/Program Files')

雙斜線和單獨的點都會被消除,但是雙點 (‘..’) 不會,以防改變符號鏈接的含義。

>>> PurePath('foo//bar')
PurePosixPath('foo/bar')
>>> PurePath('foo/./bar')
PurePosixPath('foo/bar')
>>> PurePath('foo/../bar')
PurePosixPath('foo/../bar')

###### class pathlib.** PurePosixPath(\*pathsegments)**
>>> PurePosixPath('/etc')
PurePosixPath('/etc')

其他操作與 PurePath 相同

class pathlib.PureWindowsPath(*pathsegments)
>>> PureWindowsPath('c:/Program Files/')
PureWindowsPath('c:/Program Files')

其他操作與 PurePath 相同

** 無論你正運行什么系統,你都可以實例化這些類,因為它們提供的操作不做任何系統調用 **


##### 通用性質

路徑是不可變並可哈希的。相同風格的路徑可以排序與比較。

>>> PurePosixPath('foo') == PurePosixPath('FOO')
False
>>> PureWindowsPath('foo') == PureWindowsPath('FOO')
True
>>> PureWindowsPath('FOO') in { PureWindowsPath('foo') }
True
>>> PureWindowsPath('C:') < PureWindowsPath('d:')
True

不同風格的路徑比較得到不等的結果並且無法被排序:

>>> PureWindowsPath('foo') == PurePosixPath('foo')
False
>>> PureWindowsPath('foo') < PurePosixPath('foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'PureWindowsPath' and 'PurePosixPath'

##### 運算符

斜杠操作符有助於操作子路徑

>>> p = PurePath('/etc')
>>> p
PurePosixPath('/etc')
>>> p / 'init.d' / 'apache2'
PurePosixPath('/etc/init.d/apache2')
>>> q = PurePath('bin')
>>> '/usr' / q
PurePosixPath('/usr/bin')

文件對象可用於任何接受 os.PathLike 接口實現的地方

>>> import os
>>> p = PurePath('/etc')
>>> os.fspath(p)
'/etc'

路徑的字符串表示法

>>> p = PurePath('/etc')
>>> str(p)
'/etc'
>>> p = PureWindowsPath('c:/Program Files')
>>> str(p)
'c:\\Program Files'
>>> bytes(p)
b'/etc'  # 只推薦在 Unix下調用bytes

##### 訪問路徑獨立組件

可以使用以下特征屬性:

PurePath.parts

返回一個元組,可以訪問路徑的多個組件

>>> p = PurePath('/usr/bin/python3')
>>> p.parts
('/', 'usr', 'bin', 'python3')

>>> p = PureWindowsPath('c:/Program Files/PSF')
>>> p.parts
('c:\\', 'Program Files', 'PSF')

##### 方法和特征屬性

可以使用以下特征屬性:

PurePath.drive

一個表示驅動器盤符或命名的字符串

>>> PureWindowsPath('c:/Program Files/').drive
'c:'
>>> PureWindowsPath('/Program Files/').drive
''
>>> PurePosixPath('/etc').drive
''

###### PurePath.** root**

一個表示(本地或全局)的字符串

>>> PureWindowsPath('c:/Program Files/').root
'\\'
>>> PureWindowsPath('c:Program Files/').root
''
>>> PurePosixPath('/etc').root
'/'

###### PurePath.** anchor**

驅動器和根的聯合

>>> PureWindowsPath('c:/Program Files/').anchor
'c:\\'
>>> PureWindowsPath('c:Program Files/').anchor
'c:'
>>> PurePosixPath('/etc').anchor
'/'

###### PurePath.** parents**

一個不可變序列,提供對路徑邏輯祖先的訪問

>>> 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('/')
>>> p.parent
PurePosixPath('/')
>>> p = PurePosixPath('.')
>>> p.parent
PurePosixPath('.')
>>> p = PurePosixPath('foo/..')
>>> p.parent
PurePosixPath('foo')

** 如果想要向上移動任意文件系統路徑,推薦先使用 Path.resolve() 來解析符號鏈接以及消除 ".." 組件。**


PurePath.name

一個表示最后路徑組件的字符串,排除了驅動器與根目錄

>>> PurePosixPath('my/library/setup.py').name
'setup.py'

###### PurePath.** suffix**

最后一個組件的文件擴展名

>>> PurePosixPath('my/library/setup.py').suffix
'.py'
>>> PurePosixPath('my/library.tar.gz').suffix
'.gz'
>>> PurePosixPath('my/library').suffix
''

###### PurePath.** suffixes**

路徑的文件擴展名列表

>>> PurePosixPath('my/library.tar.gar').suffixes
['.tar', '.gar']
>>> PurePosixPath('my/library.tar.gz').suffixes
['.tar', '.gz']
>>> PurePosixPath('my/library').suffixes
[]

###### PurePath.** stem**

最后一個路徑組件,除去后綴

>>> PurePosixPath('my/library.tar.gz').stem
'library.tar'
>>> PurePosixPath('my/library.tar').stem
'library'
>>> PurePosixPath('my/library').stem
'library'

###### PurePath.** as_posix()**

返回使用正斜杠(/)的路徑字符串

>>> p = PureWindowsPath('c:\\windows')
>>> str(p)
'c:\\windows'
>>> p.as_posix()
'c:/windows'

###### PurePath.** as_uri()**

將路徑表示為 file URL的格式。如果並非絕對路徑,拋出 ValueError。

>>> p = PurePosixPath('/etc/passwd')
>>> p.as_uri()
'file:///etc/passwd'
>>> p = PureWindowsPath('c:/Windows')
>>> p.as_uri()
'file:///c:/Windows'

###### PurePath.** is_absolute()**

返回此路徑是否為絕對路徑。如果路徑同時擁有驅動器符與根路徑(如果風格允許)則將被認作絕對路徑。

>>> PurePosixPath('/a/b').is_absolute()
True
>>> PurePosixPath('a/b').is_absolute()
False

>>> PureWindowsPath('c:/a/b').is_absolute()
True
>>> PureWindowsPath('/a/b').is_absolute()
False
>>> PureWindowsPath('c:').is_absolute()
False

###### PurePath.** is_reserved()**

PureWindowsPath,如果路徑是被 Windows 保留的則返回 True,否則 False。在 PurePosixPath,總是返回 False。

>>> PureWindowsPath('nul').is_reserved()
True
>>> PurePosixPath('nul').is_reserved()
False

###### PurePath.** joinpath(\*other)**

調用此方法等同於將每個 other 參數中的項目連接在一起

>>> PurePosixPath('/etc').joinpath('passwd')
PurePosixPath('/etc/passwd')
>>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd'))
PurePosixPath('/etc/passwd')
>>> PurePosixPath('/etc').joinpath('init.d', 'apache2')
PurePosixPath('/etc/init.d/apache2')
>>> PureWindowsPath('c:').joinpath('/Program Files')
PureWindowsPath('c:/Program Files')

###### PurePath.** match(pattern)**

將此路徑與提供的通配符風格的模式匹配。如果匹配成功則返回 True,否則返回 False。
如果 pattern 是相對的,則路徑可以是相對路徑或絕對路徑,並且匹配是從右側完成的,例如:

>>> 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('/a.py').match('/*.py')
True
>>> PurePath('a/b.py').match('/*.py')
False

# 大小寫的區分
>>> PureWindowsPath('b.py').match('*.PY')
True

###### PurePath.** relative_to(\*other)** 計算此路徑相對 other 表示路徑的版本。如果不可計算,則拋出 ValueError: ```python >>> p = PurePosixPath('/etc/passwd') >>> p.relative_to('/') PurePosixPath('etc/passwd') >>> p.relative_to('/etc') PurePosixPath('passwd') >>> p.relative_to('/usr') Traceback (most recent call last): File " ", line 1, in File "pathlib.py", line 694, in relative_to .format(str(self), str(formatted))) ValueError: '/etc/passwd' does not start with '/usr' ```
###### PurePath.** with_name(name)**

返回一個新的路徑並修改 name。如果原本路徑沒有 nameValueError 被拋出

>>> 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_suffix(suffix)** 返回一個新的路徑並修改后綴 suffix。如果原本的路徑沒有后綴,新的 suffix 則被追加以代替。如果 suffix 是空字符串,則原本的后綴被移除: ```python >>> 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 具體路徑

具體路徑是純路徑的子類。除了后者提供的操作之外,它們還提供了對路徑對象進行系統調用的方法。
有以下三種方法可以實例化具體路徑:

class pathlib.Path(*pathsegments)

一個 PurePath 的子類,此類以當前系統的路徑風格表示路徑(實例化為 PosixPath 或 WindowsPath):

>>> Path('setup.py')
PosixPath('setup.py')  # Unix 系統
WindowsPath('setup.py')  # Windows 系統

###### class pathlib.** PosixPath(*pathsegments)**
>>> PosixPath('/etc')
PosixPath('/etc')

###### class pathlib.** WindowsPath(*pathsegments)**
>>> WindowsPath('c:/Program Files/')
WindowsPath('c:/Program Files')

方法

除純路徑方法外,具體路徑還提供以下方法。

classmethod Path.cwd()

返回一個新的表示當前目錄的路徑對象,和 os.getcwd() 返回的相同

>>> Path.cwd()
PosixPath('/home/antoine/pathlib')

###### classmethod Path.** home()**

返回一個表示當前用戶根目錄的新路徑對象,和 os.path.expanduser() 構造含 ~ 路徑返回的相同

>>> Path.home()
PosixPath('/home/antoine')

###### Path.** stat()**

返回此路徑的信息(類似於 os.stat())。

>>> p = Path('setup.py')
>>> p.stat().st_size
956
>>> p.stat().st_mtime
1327883547.852554

###### Path.** chmod(mode)**

改變文件的模式和權限,和 os.chmod() 一樣:

>>> p = Path('setup.py')
>>> p.stat().st_mode
33277
>>> p.chmod(0o444)
>>> p.stat().st_mode
33060

###### Path.** exists()**

此路徑是否指向一個已存在的文件或目錄

>>> Path('.').exists()
True
>>> Path('setup.py').exists()
True
>>> Path('/etc').exists()
True
>>> Path('nonexistentfile').exists()
False

###### Path.** expanduser()**

返回展開了根目錄與~的構造,和 os.path.expanduser() 一樣:

>>> p = PosixPath('~/films/Monty Python')
>>> p.expanduser()
PosixPath('/home/eric/films/Monty Python')

###### Path.** glob(pattern)**

生成所有匹配 pattern 的文件

>>> 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()

如果路徑指向一個目錄(或者一個指向目錄的符號鏈接)則返回 True,如果指向其他類型的文件則返回 False
當路徑不存在或者是一個破損的符號鏈接時也會返回 False

Path.is_file()

如果路徑指向一個正常的文件(或者一個指向正常文件的符號鏈接)則返回 True,如果指向其他類型的文件則返回 False。
當路徑不存在或者是一個破損的符號鏈接時也會返回 False

如果路徑指向符號鏈接則返回 True, 否則 False。
如果路徑不存在也返回 False

Path.is_socket()

如果路徑指向一個 Unix socket 文件(或者指向 Unix socket 文件的符號鏈接)則返回 True,如果指向其他類型的文件則返回 False。
當路徑不存在或者是一個破損的符號鏈接時也會返回 False

Path.is_fifo()

如果路徑指向一個先進先出存儲(或者指向先進先出存儲的符號鏈接)則返回 True ,指向其他類型的文件則返回 False。
當路徑不存在或者是一個破損的符號鏈接時也會返回 False

Path.is_block_device()

如果文件指向一個塊設備(或者指向塊設備的符號鏈接)則返回 True,指向其他類型的文件則返回 False。
當路徑不存在或者是一個破損的符號鏈接時也會返回 False

Path.is_char_device()

如果路徑指向一個字符設備(或指向字符設備的符號鏈接)則返回 True,指向其他類型的文件則返回 False。
當路徑不存在或者是一個破損的符號鏈接時也會返回 False

Path.iterdir()

當路徑指向一個目錄時,產生該路徑下的對象的路徑

>>> p = Path('docs')
>>> for child in p.iterdir(): child
...
PosixPath('docs/conf.py')
PosixPath('docs/_templates')
PosixPath('docs/make.bat')
PosixPath('docs/index.rst')
PosixPath('docs/_build')
PosixPath('docs/_static')
PosixPath('docs/Makefile')

###### Path.** mkdir(mode=0o777, parents=False, exist_ok=False)**

創建目錄

Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)

打開路徑指向的文件

>>> p = Path('setup.py')
>>> with p.open() as f:
...     f.readline()
...
'#!/usr/bin/env python3\n'

###### Path.** owner()**

返回擁有此文件的用戶名。如果文件的 UID 無法在系統數據庫中找到,則拋出 KeyError。

Path.read_bytes()

以字節對象的形式返回路徑指向的文件的二進制內容:

>>> p = Path('my_binary_file')
>>> p.write_bytes(b'Binary file contents')
20
>>> p.read_bytes()
b'Binary file contents'

###### Path.** read_text(encoding=None, errors=None)**

以字符串形式返回路徑指向的文件的解碼后文本內容

>>> p = Path('my_text_file')
>>> p.write_text('Text file contents')
18
>>> p.read_text()
'Text file contents'

###### Path.** rename(target)**

使用給定的 target 將文件重命名

>>> p = Path('foo')
>>> p.open('w').write('some text')
9
>>> target = Path('bar')
>>> p.rename(target)
>>> target.open().read()
'some text'

###### Path.** replace(target)**

使用給定的 target 重命名文件或目錄。

Path.resolve(target)

將路徑絕對化,解析任何符號鏈接。返回新的路徑對象:

>>> 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)**

與給定模式前面添加'**'一樣調用 Path.glob():

>>> sorted(Path().rglob("*.py"))
[PosixPath('build/lib/pathlib.py'),
 PosixPath('docs/conf.py'),
 PosixPath('pathlib.py'),
 PosixPath('setup.py'),
 PosixPath('test_pathlib.py')]

###### Path.** rmdir()**

移除此目錄。此目錄必須為空的。

Path.samefile(other_path)

返回此目錄是否指向與可能是字符串或者另一個路徑對象的 other_path 相同的文件。

>>> p = Path('spam')
>>> q = Path('eggs')
>>> p.samefile(q)
False
>>> p.samefile('spam')
True

###### Path.** symlink_to(target, target_is_directory=False)**

將此路徑創建為指向 target 的符號鏈接。在 Windows 下,如果鏈接的目標是一個目錄則 target_is_directory 必須為 true (默認為 False)。在 POSIX 下, target_is_directory 的值將被忽略。

>>> p = Path('mylink')
>>> p.symlink_to('setup.py')
>>> p.resolve()
PosixPath('/home/antoine/pathlib/setup.py')
>>> p.stat().st_size
956
>>> p.lstat().st_size
8

###### Path.** touch(mode=0o666, exist_ok=True)**

將給定的路徑創建為文件。
如果給出了 mode 它將與當前進程的 umask 值合並以確定文件的模式和訪問標志。如果文件已經存在,則當 exist_ok 為 true 則函數仍會成功(並且將它的修改事件更新為當前事件),否則拋出 FileExistsError。

移除此文件或符號鏈接。如果路徑指向目錄,則用 Path.rmdir() 代替。

Path.write_bytes(data)

將文件以二進制模式打開,寫入 data 並關閉:

>>> p = Path('my_binary_file')
>>> p.write_bytes(b'Binary file contents')
20
>>> p.read_bytes()
b'Binary file contents'

###### Path.** write_text(data, encoding=None, errors=None)**

將文件以文本模式打開,寫入 data 並關閉:

>>> p = Path('my_text_file')
>>> p.write_text('Text file contents')
18
>>> p.read_text()
'Text file contents'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM