python3.4新增的标准库pathlib模块
python3.4版本新增了pathlib模块,它使用面向对象的编程方式来表示文件系统路径。
而在此之前和路径相关操作函数都放在os模块里面,尤其是os.path这个子模块。
不过,pathlib再python3.4版本和python3.6以上的版本有所差异,如果想全面使用pathlib模块,应该使用Python3.6或者更高版本。
基本使用
创建Path对象
In : p = Path(r'd:\test\tt.txt.bk')
获取文件名
In : p.name
Out: tt.txt.bk
获取文件名(去掉一个后缀)
In : p.stem
Out: tt.txt
获取文件一个后缀
In : p.suffix
Out: .bk
获取文件的所有后缀
In : p.suffixs
Out: ['.txt', '.bk']
获取一个父级目录
In : p.parent
Out: WindowsPath('d:/test')
获取所有父级目录
In : p.parents
Out: <WindowsPath.parents>
In : for i in p.parents:
...: print(i)
Out: d:\test
...: d:\
分割路径
In : a.parts
Out: ('d:\\', 'test', 'tt.txt.bk')
pathlib和os.path对应的方法一览
| os and os.path | pathlib |
|---|---|
| os.path.abspath | Path.resolve |
| os.chmod | Path.chmod |
| os.mkdir | Path.mkdir |
| os.rename | Path.rename |
| os.replace | Path.replace |
| os.rmdir | Path.rmdir |
| os.remove, os.unlink | Path.unlink |
| os.getcwd | Path.cwd |
| os.path.exists | Path.exists |
| os.path.expanduser | Path.expanduser and Path.home |
| os.path.isdir | Path.is_dir |
| os.path.isfile | Path.is_file |
| os.path.islink | Path.is_symlink |
| os.stat | Path.stat, Path.owner, Path.group |
| os.path.isabs | PurePath.is_absolute |
| os.path.join | PurePath.joinpath |
| os.path.basename | PurePath.name |
| os.path.dirname | PurePath.parent |
| os.path.samefile | Path.samefile |
| os.path.splitext | PurePath.suffix |
pathlib特色
用/拼接路径
过去路径拼接是用os.path.join:
In : os.path.join('/', 'home', 'dongwm/code')
Out: '/home/dongwm/code'
In : os.path.join('/home', 'dongwm/code')
Out: '/home/dongwm/code'
现在可以用pathlib.Path提供的joinpath来拼接:
In : Path('/').joinpath('home', 'dongwm/code')
Out: PosixPath('/home/dongwm/code')
但是更简单和方便的方法是用/运算符:
In : Path('/') / 'home' / 'dongwm/code'
Out: PosixPath('/home/dongwm/code')
In : Path('/') / Path('home') / 'dongwm/code'
Out: PosixPath('/home/dongwm/code')
In : '/' / Path('home') / 'dongwm/code'
Out: PosixPath('/home/dongwm/code')
链式调用
os.path把路径作为函数参数传进去,一个很长的例子:
In : os.path.isfile(os.path.join(os.path.expanduser('~/lyanna'), 'config.py'))
Out: True
pathlib写法
In : (Path('~/lyanna').expanduser() / 'config.py').is_file()
Out: True
touch方法
Python语言没有内置创建文件的方法(linux下的touch命令),过去这么做:
In :with open('new.txt', 'a') as f:
...: ...
现在可以直接用Path的touch方法:
In: Path('new.txt').touch()
touch接受mode参数,能够在创建时确认文件权限,还能通过exist_ok参数方式确认是否可以重复touch(默认可以重复创建,会更新文件的mtime)
获得home目录
过去的写法:
In : os.path.expanduser('~')
Out: '/Users/dongweiming'
现在就Path.home就可以了:
In : Path.home()
Out: PosixPath('/Users/dongweiming')
读写文件
Path对象自带了操作文件的方法:
In : p = Path('~/1.txt').expanduser()
In : p.write_text('123\n')
Out: 4
In : p.read_text()
Out: '123\n'
In : p.write_bytes(b'456\n')
Out: 4
In : p.read_bytes()
Out: b'456\n'
In : with p.open() as f:
...: for line in f:
...: print(line)
...:
456
修改文件名或文件路径 with_name/with_suffix
举个例子,有一个文件地址'/home/gentoo/screenshot/abc.jpg',2个需求:
jpg格式转为png
In : p = Path('/home/gentoo/screenshot/abc.jpg')
In : p.with_suffix('.png')
Out: PosixPath('/home/gentoo/screenshot/abc.png')
abc名称改为123
In : p.with_name(f'123{p.suffix}')
Out: PosixPath('/home/gentoo/screenshot/123.jpg')
mkdir
In : Path('1/2/3').mkdir(parents=True)
owner
有时候操作文件前需要确认拥有此文件的用户,过去都是这么写:
In : import pwd
In : pwd.getpwuid(os.stat('/usr/local/etc/my.cnf').st_uid).pw_name
Out: 'gengleiming'
现在封装起来可以直接用了:
In : p.owner()
Out: 'gengleiming'

浙公网安备 33010602011771号