Python 路径操作
1、os.path
操作
- 3.4 版本之前,使用
os.path
模块 os.path
模块输出结果都是字符串,操作的对象也是字符串,没有单独的os.path
对象
# Windows 11 Jupyter Notebook
from os import path
p = path.join('/a', 'b', 'c')
print(1, type(p), p)
print(2, path.exists(p))
print(3, path.split(p))
print(4, path.dirname(p), path.basename(p))
print(5, path.abspath(p))
print(6, path.abspath(''), path.abspath('.'))
print(7, path.splitdrive('c:/temp/test')) # windows method
print(8, path.splitdrive('/temp/test'))
# path.abspath() TypeError: abspath() missing 1 required positional argument: 'path'
1 <class 'str'> /a\b\c
2 False
3 ('/a\\b', 'c')
4 /a\b c
5 C:\a\b\c
6 C:\Users\jiao1 C:\Users\jiao1
7 ('c:', '/temp/test')
8 ('', '/temp/test')
# Windows 11 PyCharm 环境
from os import path
p1 = path.abspath(__file__)
print('=' * len(p1))
print(p1)
i = 1
while p1 != path.dirname(p1):
dirname = path.dirname(p1)
print(i, dirname)
i += 1
p1 = dirname
===================================================
D:\PycharmProjects\pythonProject\202108089\test4.py
1 D:\PycharmProjects\pythonProject\202108089
2 D:\PycharmProjects\pythonProject
3 D:\PycharmProjects
4 D:\
2、pathlib
模块
- 3.4 之后,建议使用
pathlib
模块,提供Path
对象来操作,包括目录和文件 from pathlib import Path
2.1 目录初始化
from pathlib import Path
print(1, Path(), Path(''), Path('.')) # 均表示 当前目录
print(2, Path('a', 'b', 'c/d')) # 当前目录下的 a/b/c/d
print(3, Path('/etc')) # 根下的 etc 目录
print(4, Path().absolute(), Path('').absolute(), Path('.').absolute())
1 . . .
2 a\b\c\d
3 \etc
4 C:\Users\jiao1 C:\Users\jiao1 C:\Users\jiao1
p = Path()
print(type(p), p.absolute())
Out:
<class 'pathlib.WindowsPath'> C:\Users\jiao1
2.2 路径的拼接
-
操作符
/
Path 对象 / Path 对象 (得到一个 Path 对象) Path 对象 / 字符串 (得到一个 Path 对象) 字符串 / Path 对象 (得到一个 Path 对象) Path 对象 / 字符串 / 字符串 (得到一个 Path 对象) 错误示范: 字符串 / 字符串 / Path 对象 (字符串 无法相除)
'c' / Path('z.txt') # WindowsPath('c/z.txt') Path('.').absolute() / 'a.py' # WindowsPath('C:/Users/jiao1/a.py') 'c:/' / Path('z.txt') # WindowsPath('c:/z.txt') Path('.').absolute() / 'c' / 'd' / 'e.txt' # PosixPath('/usr/bin/c/d/e.txt')
-
joinpath(*others)
连接多个字符串或者Path
对象 得到Path
对象(Path().absolute()).joinpath('a', 'c', 'd/e') # WindowsPath('C:/Users/jiao1/a/c/d/e') Path.joinpath(Path().absolute(), 'z.py') # WindowsPath('C:/Users/jiao1/z.py') Path.joinpath(Path().absolute(), 'a/b/c/d/e') # WindowsPath('C:/Users/jiao1/a/b/c/d/e') Path.joinpath(Path().absolute(), Path('sybil') ,'a/b/c', Path('d/z.py')) # WindowsPath('C:/Users/jiao1/sybil/a/b/c/d/z.py') Path.joinpath(Path().absolute(), 'z.py') # PosixPath('/usr/bin/z.py')
2.3 路径的分解
-
parts
属性,可以返回路径中的每一个部分p = Path.joinpath(Path().absolute(), Path('sybil') ,'a/b/c', Path('d/z.py')) p # WindowsPath('C:/Users/jiao1/sybil/a/b/c/d/z.py') p.parts # ('C:\\', 'Users', 'jiao1', 'sybil', 'a', 'b', 'c', 'd', 'z.py')
2.4 获取路径
-
str
获取路径字符串 -
bytes
获取路径字符串的bytes
p = Path('/etc') print(str(p), bytes(p), sep=' *** ') # \etc *** b'\\etc'
2.5 目录的父目录
p = Path.joinpath(Path().absolute(), Path('sybil') ,'a/b/c', Path('d/z.py'))
p # WindowsPath('C:/Users/jiao1/sybil/a/b/c/d/z.py')
p.parents # <WindowsPath.parents>
type(p.parents) # pathlib._PathParents
p.parent # WindowsPath('C:/Users/jiao1/sybil/a/b/c/d')
p.parent.parent # WindowsPath('C:/Users/jiao1/sybil/a/b/c')
p.parents[0] # WindowsPath('C:/Users/jiao1/sybil/a/b/c/d')
p.parents[1] # WindowsPath('C:/Users/jiao1/sybil/a/b/c')
# p.parents[-1] # Path.parents 不支持负索引,因为时惰性求值,需要一层层计算
# print 打印只是一种表达形式,其实质时 str(object)
for x in p.parents:
print(x, type(x))
Out:
C:\Users\jiao1\sybil\a\b\c\d <class 'pathlib.WindowsPath'>
C:\Users\jiao1\sybil\a\b\c <class 'pathlib.WindowsPath'>
C:\Users\jiao1\sybil\a\b <class 'pathlib.WindowsPath'>
C:\Users\jiao1\sybil\a <class 'pathlib.W