原文:https://xin053.github.io/2016/07/03/pathlib%E8%B7%AF%E5%BE%84%E5%BA%93%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3/python
pathlib簡介
pathlib庫在python 3.4之後已經成爲標準庫,基本上能夠代替os.path
來處理路徑。它採用徹底面對對象的編程方式。linux
總共有6個類用來處理路徑,大致能夠分爲兩類:git
- pure paths 單純的路徑計算操做而沒有IO功能
- concrete paths 路經計算操做和IO功能
這6個類的繼承關係以下:github
能夠看到PurePath
是全部類的基類,咱們重點要掌握PurePath
和Path
這兩個類,在Windows平臺下路徑對象會有Windows前綴,Unix平臺上路徑對象會有Posix前綴。編程
基本使用
列出全部子目錄
1
2
3
4
5
6
7
|
>>> import pathlib
>>> p = pathlib.Path('.')
>>> [x for x in p.iterdir() if x.is_dir()]
[WindowsPath('.git'), WindowsPath('.idea'), WindowsPath('.vscode'),
WindowsPath('1_函數參數'), WindowsPath('2_生成器'), WindowsPath('3_經常使用函數'),
WindowsPath('4_裝飾器), WindowsPath('5_經常使用模塊')]
# 在linux環境下,上述的WindowsPath都會變爲PosixPath
|
列出指定類型的文件
1
|
list(p.glob(
'**/*.py'))
|
路徑拼接
能夠使用/
符號來拼接路徑windows
1
2
3
4
|
>>> p = pathlib.Path(r'F:\cookies\python')
>>> q = p / 'learnPython'
>>> print(q)
F:\cookies\python\learnPython
|
查詢屬性
1
2
3
4
|
>>> q.exists()
True
>>> q.is_dir()
True
|
打開文件
1
2
3
4
|
>>> q = q / "hello_world.py"
>>> with q.open() as f:
>>> print(f.readline())
#!/usr/bin/env python
|
Pure paths
產生Pure paths的三種方式
class pathlib.PurePath(*pathsegments)cookie
1
2
3
|
>>> PurePath('setup.py')
PurePosixPath(
'setup.py') # Running on a Unix machine
PureWindowsPath(
'setup.py') # Running on a Windows machine
|
1
2
3
4
|
>>> PurePath('foo', 'some/path', 'bar')
PureWindowsPath(
'foo/some/path/bar')
>>> PurePath(Path('foo'), Path('bar'))
PureWindowsPath(
'foo/bar')
|
若是參數爲空,則默認指定當前文件夾ide
1
2
|
>>> PurePath()
PureWindowsPath(
'.')
|
當同時指定多個絕對路徑,則使用最後一個函數
1
2
|
>>> PureWindowsPath('c:/Windows', 'd:bar')
PureWindowsPath(
'd:bar')
|
在Windows平臺上,參數路徑上若是有\
或者/
,則使用以前設置的盤符ui
1
2
|
>>> PureWindowsPath('F:\cookies\python\learnPython','\game')
PureWindowsPath(
'F:/game')
|
class pathlib.PurePosixPath(*pathsegments)
1
2
|
>>> PurePosixPath('/etc')
PurePosixPath(
'/etc')
|
class pathlib.PureWindowsPath(*pathsegments)
1
2
|
>>> PureWindowsPath('c:/Program Files/')
PureWindowsPath(
'c:/Program Files')
|
Path計算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
>>> 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: unorderable types: PureWindowsPath() < PurePosixPath()
|
str() 和 bytes()
1
2
3
4
5
6
7
8
|
>>> p = PurePath('/etc')
>>> str(p)
'/etc'
>>> p = PureWindowsPath('c:/Program Files')
>>> str(p)
'c:\\Program Files'
>>> bytes(p)
b'/etc'
|
經常使用屬性和方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
>>> PureWindowsPath('c:/Program Files/').drive
'c:'
>>> PurePosixPath('/etc').root
'/'
>>> 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:/')
>>> PureWindowsPath('//some/share/setup.py').name
'setup.py'
>>> PureWindowsPath('//some/share').name
''
>>> PurePosixPath('my/library/setup.py').suffix
'.py'
>>> PurePosixPath('my/library.tar.gz').suffix
'.gz'
>>> PurePosixPath('my/library').suffix
''
>>> PurePosixPath('my/library.tar.gar').suffixes
[
'.tar', '.gar']
>>> PurePosixPath('my/library.tar.gz').suffixes
[
'.tar', '.gz']
>>> PurePosixPath('my/library').suffixes
[]
>>> PurePosixPath('my/library.tar.gz').stem
'library.tar'
>>> PurePosixPath('my/library.tar').stem
'library'
>>> PurePosixPath('my/library').stem
'library'
>>> p = PureWindowsPath('c:\\windows')
>>> str(p)
'c:\\windows'
>>> p.as_posix()
'c:/windows'
>>> p = PurePosixPath('/etc/passwd')
>>> p.as_uri()
'file:///etc/passwd'
>>> p = PureWindowsPath('c:/Windows')
>>> p.as_uri()
'file:///c:/Windows'
>>> 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
>>> 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
"<stdin>", line 1, in <module>
File
"pathlib.py", line 694, in relative_to
.format(str(self), str(formatted)))
ValueError:
'/etc/passwd' does not start with '/usr'
>>> 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
>>> 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')
|
Concrete paths
產生Concrete paths的三種方式
class pathlib.Path(*pathsegments)
1
2
3
|
>>> Path('setup.py')
PosixPath(
'setup.py') # Running on a Unix machine
WindowsPath(
'setup.py') # Running on a Windows machine
|
class pathlib.PosixPath(*pathsegments)
1
2
|
>>> PosixPath('/etc')
PosixPath(
'/etc')
|
class pathlib.WindowsPath(*pathsegments)
1
2
|
>>> WindowsPath('c:/Program Files/')
WindowsPath(
'c:/Program Files')
|
經常使用方法
cwd()
設置path對象爲當前路徑
1
2
|
>>> Path.cwd()
WindowsPath(
'D:/Python 3.5')
|
stat()
獲取文件或目錄屬性
1
2
3
|
>>> p = Path('setup.py')
>>> p.stat().st_size
956
|
chmod()
Unix系統修改文件或目錄權限
exists()
判斷文件或目錄是否存在
1
2
3
4
5
6
7
8
9
|
>>> from pathlib import *
>>> Path('.').exists()
True
>>> Path('setup.py').exists()
True
>>> Path('/etc').exists()
True
>>> Path('nonexistentfile').exists()
False
|
glob()
列舉文件
1
2
3
4
5
6
7
8
9
10
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')]
# The "**" pattern means "this directory and all subdirectories, recursively"
|
is_dir()
判斷是不是目錄
is_file()
判斷是不是文件
is_symlink()
判斷是不是連接文件
iterdir()
若是path指向一個目錄,則返回該目錄下全部內容的生成器
mkdir(mode=0o777, parents=False)
建立目錄
open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
打開文件
owner()
獲取文件全部者
rename(target)
修更名稱
1
2
3
4
5
6
7
|
>>> p = Path('foo')
>>> p.open('w').write('some text')
9
>>> target = Path('bar')
>>> p.rename(target)
>>> target.open().read()
'some text'
|
resolve()
Make the path absolute, resolving any symlinks. A new path object is returned
1
2
3
4
5
|
>>> p = Path()
>>> p
PosixPath(
'.')
>>> p.resolve()
PosixPath(
'/home/antoine/pathlib')
|
rmdir()
刪除目錄,目錄必須爲空
touch(mode=0o777, exist_ok=True)
建立空文件