17 - 路径操作-shutil模块

本文介绍了Python中的路径操作,包括os.path模块的路径拼接、判断方法,pathlib模块的目录和文件操作,以及shutil模块的文件复制、删除、移动和打包功能。重点讲解了pathlib的Path对象,如初始化、拼接、获取路径、父目录以及全局方法等。

1 路径操作

        使用Python操作文件系统时,少不了会对路径进行切换,对目录的遍历,以及获取文件的绝对路径的一系列的操作,Python内置了相关的模块完成对应的功能,其中:

  • 3.4 以前使用os.path模块
  • 3.4 开始使用pathlib模块

1.1 os.path模块

        os.path是os模块中的一个比较重要的用来拼接、判断路径的主要方法,它主要有如下方法:

os.path.abspath('dir/file')    获取dir/file的绝对路径
os.path.split('path')          把路径分割为目录和文件名组成的元组格式,不管path是否存在
os.dirname('path')             获取文件的父目录名称,不管path是否存在
os.basename('path')            获取文件的名称,不管path是否存在
os.path.exists('path')         判断path是否存在,return bool
os.path.isabs('path')          判断path是否是从根开始,return bool
os.path.isfile('path')         判断path是否是一个文件
os.path.isdir('path')          判断path是否是一个目录
os.path.join('path1','path2','path3'):把path1和path2及path3进行组合,但如果path2中包含了根路径,那么就会舍弃path1,从path2开始组合
os.path.getatime('path')       获取文件的atime时间,返回时间戳
os.path.getmtime('path')       获取文件的mtime时间,返回时间戳
os.path.getsize(filename)      获取文件的大小,单位是字节

Linux下:从/开始,Windows下从C,D,E盘开始

In [1]: import os                                                            

In [2]: os.path.join('/etc','sysconfig','network-scripts')                   
Out[2]: '/etc/sysconfig/network-scripts'

In [3]: os.path.join('/etc','/sysconfig','network-scripts')                  
Out[3]: '/sysconfig/network-scripts'

In [8]: p = os.path.join('/etc','sysconfig','network-scripts')               

In [9]: p                                                                    
Out[9]: '/etc/sysconfig/network-scripts'

In [10]: type(p)                                                             
Out[10]: str

In [12]: os.path.exists(p)                                                   
Out[12]: True

In [13]: os.path.split(p)                                                    
Out[13]: ('/etc/sysconfig', 'network-scripts')

In [14]: os.path.abspath('.')                                                
Out[14]: '/home/python/py368'

In [16]: os.path.dirname(p)                                                  
Out[16]: '/etc/sysconfig'

In [17]: os.path.basename(p)                                                 
Out[17]: 'network-scripts'

>>> os.path.splitdrive('c:/etc/sysconfig/network-script')   # windows 
('c:', '/etc/sysconfig/network-script')

__file__:变量比较特殊,存放的是当前的Python文件的名称,我们可以使用os.path.abspath(file)来获取当前python文件的绝对路径,然后进行打包或者进行相对调用。

1.2 pathlib模块

        3.4以后建议使用pathlib模块,它提供Path对象来对路径进行操作,还包括了目录和文件。

在使用时需要实现导入: from pathlib import Path

1.2.1 目录操作

下面来说一下日常的目录相关操作

初始化(一个路径对象)

通过构建一个Path对象来对路径进行初始化


In [19]: from pathlib import Path                                            
In [20]: p = Path()  # 当前目录                                              
In [21]: p1 = Path('a','b','c')   # 当前目录下的a/b/c                                            
In [22]: p2 = Path('/etc','sysconfig','network-scripts')  # /etc/sysconfig/network-scripts

In [23]: p                                                                   
Out[23]: PosixPath('.')

In [24]: p1                                                                  
Out[24]: PosixPath('a/b/c')

In [25]: p2                                                                  
Out[25]: PosixPath('/etc/sysconfig/network-scripts')

路径拼接和分解

/: Path对象支持使用/来进行路径的拼接,拼接规则应遵循:

  • Path对象 / Path对象
  • Path对象 / 字符串 或者 字符串 / Path对象
In [30]: p2 / 'ifcfg-eth0'                                                   
Out[30]: PosixPath('/etc/sysconfig/network-scripts/ifcfg-eth0')

In [35]: p2 / p1                                                             
Out[35]: PosixPath('/etc/sysconfig/network-scripts/a/b/c')

In [37]: '/root' / p2                                                        
Out[37]: PosixPath('/etc/sysconfig/network-scripts')

需要注意的是:

  1. 拼接的顺序和路径的顺序是一致的
  2. p1 是相对路径,而p2是从根开始,如果p1/p2 那么返回的将会是p2
  3. 如果当 字符串 / Path对象这种格式时,如果Path对象是一个绝对路径,那么将无法进行拼接

parts属性: 将Path对象按照当前操作系统的分隔符进行分割返回一个元组

In [39]: p2.parts                                                            
Out[39]: ('/', 'etc', 'sysconfig', 'network-scripts')

joinpath(*other): 在Path对象中使用当前操作系统的路径分隔符分割并追加多个字符串。

In [43]: p2.joinpath('/etc')                                                 
Out[43]: PosixPath('/etc')

In [44]: p2.joinpath('etc')                                                  
Out[44]: PosixPath('/etc/sysconfig/network-scripts/etc')

In [50]: p2.joinpath('/etc','/proc')                                        
Out[50]: PosixPath('/proc')

需要注意的是:

  1. 如果添加的的路径都为/开始,那么最后添加的路径将会覆盖前面所有添加的路径字符串
获取路径

        Path返回的是一个路径对象,那么如何才可以只打印路径的字符串格式呢,我们可以通过str(Path对象)进行转换,当需要bytes格式时,也可以使用bytes(Path对象)转换。

In [51]: bytes(p2)                                                           
Out[51]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值