pathlib 是python3.4中新加入的文件夹处理包, 本文主要对比os与pathlib的用法
获取当前路径:
In [1]: import os
In [2]: from pathlib import Path
OS
In [3]: os.getcwd()
Out[3]: '/home/###/Desktop/data_anaysis/img/folder'
Pathlib
In [4]: Path.cwd()
Out[4]: PosixPath('/home/###/Desktop/data_anaysis/img/folder')
路径连接
OS
In [6]: os.path.join('subfolder', 'sample.txt')
Out[6]: 'subfolder/sample.txt'
Pathlib
In [8]: Path('subfolder') / 'sample.txt'
Out[8]: PosixPath('subfolder/sample.txt')
或者
In [9]: Path().joinpath('subfolder', 'sample.txt')
Out[9]: PosixPath('subfolder/sample.txt')
路径拆分
OS
In [1]: path = '/Desktop/data_anaysis/img/folder'
In [2]: os.path.split(path)
Out [2]: ('/Desktop/data_anaysis/img', 'folder')
pathlib
in [4]: pathlib.Path(path).parts
Out [4]: ('/', 'Desktop', 'data_anaysis', 'img', 'folder')
获取根目录
os
In [10]: os.path.expanduser("~")
Out[10]: '/home/###'
pathlib
In [11]: Path.home()
Out[11]: PosixPath('/home/###')
获取绝对路径
OS
In [12]: os.path.abspath('example.png')
Out[12]: '/home/###/Desktop/data_anaysis/img/folder/example.png'
Pathlib
In [13]: Path('example.png').resolve()
Out[13]: PosixPath('/home/###/Desktop/data_anaysis/img/folder/example.png')
or
In [14]: Path('example.png').absolute()
Out[14]: PosixPath('/home/###/Desktop/data_anaysis/img/folder/example.png')
获取文件名
In [15]: os_path = os.path.join('subfolder', 'example1.png')
In [16]: pathlib_path = Path('subfolder') / 'example1.png'
OS
In [17]: os.path.basename(os_path)
Out[17]: 'example1.png'
Pathlib
In [18]: pathlib_path.name
Out[18]: 'example1.png'
获取文件所在文件夹名
OS
In [19]: os.path.dirname(os_path)
Out[19]: 'subfolder'
Pathlib
In [20]: pathlib_path.parent
Out[20]: PosixPath('subfolder')
获取文件名后缀
OS
In [22]: os.path.splitext(os_path)[1]
Out[22]: '.png'
Pathlib
In [23]: pathlib_path.suffix
Out[23]: '.png'
获取文件名前缀
OS
In [24]: os.path.splitext(os_path)[0]
Out[24]: 'subfolder/example1'
Pathlib
In [25]: pathlib_path.stem
Out[25]: 'example1'
创建文件夹
OS
In [26]: os.mkdir('folder1')
In [27]: os.makedirs('./folder1/folder1', exist_ok=True)
Pathlib
In [29]: Path('./folder2').mkdir(exist_ok=True)
In [30]: Path('./folder3/folder').mkdir(parents=True, exist_ok=True)
遍历文件夹
OS
In [56]: filepath_list = []
In [57]: for root, dir_, files_ in os.walk("./subfolder"):
...: for file in files_:
...: if file.endswith('.png'):
...: file_path = os.path.join(root, file)
...: filepath_list.append(file_path)
In [58]: filepath_list
Out[58]:
['./subfolder/example1.png',
'./subfolder/flow_prediction_part2.png',
'./subfolder/validation_timeserie_examples.png',
'./subfolder/folder/sound_to_spectrogram.png',
'./subfolder/folder/loss_training.png',
'./subfolder/folder/validation_spec_examples.png',
'./subfolder/folder/Unet_noisyvoice_to_noisemodel.png',
'./subfolder/folder/structure_folder.png']
Pathlib
In [59]: file_list = Path('./subfolder').glob('**/*.png')
#这里用.glob('*.png')的话,不会检索子文件夹下的图片
In [60]: list(file_list)
[PosixPath('subfolder/example1.png'),
PosixPath('subfolder/flow_prediction_part2.png'),
PosixPath('subfolder/validation_timeserie_examples.png'),
PosixPath('subfolder/folder/sound_to_spectrogram.png'),
PosixPath('subfolder/folder/loss_training.png'),
PosixPath('subfolder/folder/validation_spec_examples.png'),
PosixPath('subfolder/folder/Unet_noisyvoice_to_noisemodel.png'),
PosixPath('subfolder/folder/structure_folder.png')]
或者:
In [63]: file_list2 = Path('./subfolder').rglob('*.png')
In [64]: list(file_list2)
Out[64]:
[PosixPath('subfolder/example1.png'),
PosixPath('subfolder/flow_prediction_part2.png'),
PosixPath('subfolder/validation_timeserie_examples.png'),
PosixPath('subfolder/folder/sound_to_spectrogram.png'),
PosixPath('subfolder/folder/loss_training.png'),
PosixPath('subfolder/folder/validation_spec_examples.png'),
PosixPath('subfolder/folder/Unet_noisyvoice_to_noisemodel.png'),
PosixPath('subfolder/folder/structure_folder.png')]
确认是否是文件夹
OS
In [65]: os.path.isdir(os_path)
Out[65]: False
In [66]: os.path.isdir(os.path.join('subfolder'))
Out[66]: True
Pathlib
In [67]: pathlib_path.is_dir()
Out[67]: False
In [68]: pathlib_path.parent.is_dir()
Out[68]: True
文件夹移动
文件夹移动还是用shutil吧
总结
总体来看 Pathlib比os好用的多, 尤其是在遍历文件夹, 找文件夹下相应后缀文件的时候, 所以能用pathlib还是用pathlib比较好。。