python基础 ---路径操作(Path类)

os.path模块

os.path.join

p = path.join(path, *paths)
返回值是path和*paths的串联,路径分隔符根据系统环境而定,windows下是\,linux下是/;
另外,windows下的Pycharm中调用path.join时路径分隔符也是\
#windows环境下path.join路径分隔符是\(Pycharm)
from os impot path
p = path.join('c:\\','config') #双斜杠用于转义
#p = path.join('c:', '\config')	
print(type(p), p)
<class 'str'> c:\config

注意:windows中,由于磁盘驱动器有一个当前目录,因此path.join('c:', 'config')不会表示成c:\config,而是c:config

#linux下的操作效果(jupyter notebook)
>>> from os import path
>>> p = path.join('/etc','a','b')
>>> print(type(p), p)
<class 'str'> /etc/a/b

os.path.split()

os.path.split(path) -->(head, tail)
将路径分成首尾两部分,以tuple的方式展示
>>> from os import path
>>> p = path.join('/etc', 'sysconfig', 'network')
>>> print(p)
>>> print(path.split(p))
/etc/sysconfig/network
('/etc/sysconfig', 'network')

os.path.abspath

#显示绝对路径
>>> from os import path
>>> p = path.join('/etc', 'sysconfig', 'network')
>>> print(path.abspath(p))
/etc/sysconfig/network

os.path.dirname

 #取出路径名
>>> p = '/etc/sysconfig/network'
>>> print(path.dirname(p))
/etc/sysconfig

os.path.basename

#取出路径下的基名
>>> p = '/etc/sysconfig/network'
>>> print(path.dirname(p))
network

os.path.splitdrive (Pycharm)

path.splitdrive('o:\windows\config')
('o:', '\\windows\\config') #windows输出会转义

示例

#打印父目录
>>> p1 = path.abspath('/etc/sysconfig/network/scipts')
>>> print(p1)
>>> while p1 != path.dirname(p1):
>>>     p1 = path.dirname(p1)
>>>     print(p1)
/etc/sysconfig/network/scipts
/etc/sysconfig/network
/etc/sysconfig
/etc
/

os.path模块操作目录未免比较麻烦,因此Python3.4后引入了Path类,更加简化了对目录的操作

Path类

Path类属于pathlib模块,因此使用时需要事先导入pathlib模块
初始化

(1)生成当前目录字符串
p = Path()或Path('.')或Path('')
(2)在当前目录下生目录字符串
p = Path('a', 'b', 'c', 'd/e') #当前目录下的a/b/c/d/e目录
(3)复合使用
p = Path('/etc/', Path('sysconfig'), 'network/ifcfg')
from pathlib import Path
p1 = Path()
print('p1=', p1)
p2 = Path('a', 'b', 'c', 'd/e') #当前目录下的a/b/c/d/e目录
print('p2=', p2)
p3 = Path('/etc/', Path('sysconfig'), 'network/ifcfg')
print('p3=', p3)
p1= .
p2= a/b/c/d/e
p3= /etc/sysconfig/network/ifcfg

拼接

拼接的几种模式:
字符串/Path对象
Path对象/Path对象
Path对象/字符串
特别地:没有“字符串/字符串”这种形式,使用了会报错

joinpath

#joinpath(*others)
#将others中的字符串连接至当前目录
>>> from pathlib import Path
>>> p = Path() #当前目录即为工作目录
>>> p = p / 'a'
>>> p1 = 'b' / p
>>> p2 = Path('c')
>>> p3 = p2 / p1
>>> print(p1, p2, p3)
>>> print(p3.parts)
>>> print(p3.joinpath('d', 'e/f', Path('g/h')))
b/a c c/b/a
('c', 'b', 'a')
c/b/a/d/e/f/g/h

目录分解

#parts属性,返回目录各部分的元组
p = Path('a/b/c/d')
print(p.parts)

父目录

p = Path('/magedu/mysql/install/mysql.tar.gz')
print(p.parent)
for x in p.parents: # 可迭代对象
    print(x)

目录组成部分

name.stem,suffix,suffixes,with_suffix(suffix),with_name(name)
- name:路径中的最后一个部分
- suffix:路径中最后一个部分的扩展名
- stem:路径中的最后一个部分,不带后缀名
- name = stem + suffix #不带后缀的部分加上后缀就是路径中的最后一个部分
suffixes返回多个扩展名列表:
with_suffix(suffix):最后一部分有扩展名则替换,否则补充扩展名
with_name(name):替换目录的最后因部分并返回一个新路径

特别注意:
p = Path('/magedu/mysql/install/mysql/'),使用with_name方法时,mysql/部分会被替换

from pathlib import Path
p = Path('/magedu/mysql/install/mysql.tar.gz')
print(1,p.parent)
print(2,p.name)
print(3,p.stem)
print(4,p.suffix)
print(5,p.suffixes)
print(6,p.with_name('redis'))
print(7,p.with_name('redis').with_suffix('.zip'))

1 \magedu\mysql\install
2 mysql.tar.gz
3 mysql.tar
4 .gz
5 ['.tar', '.gz']
6 \magedu\mysql\install\redis
7 \magedu\mysql\install\redis.zip

全局方法

  • cwd()返回当前工作目录(python文件所在的目录)
  • home()返回当前用户的家目录
p = Path('/magedu/mysql/install/mysql.tar.gz')
print(p.cwd(), Path.cwd())
print(p.home(), Path.home())

判断方法
前提:判断的文件对象必须存在,若文件不存在,那么判断类型则无意义,都会返回False

exists() 目录或文件是否存在
is_dir() 是否是目录,目录存在返回True
is_file() 是否是普通文件,文件存在返回True
is_symlink() 是否是软链接
is_socket() 是否是socket文件
is_block_device() 是否是块设备
is_char_device() 是否是字符设备
is_absolute() 是否是绝对路径
p2.exists()
p2.is_dir()
Path('/tmp').is_dir()
Path('/tmp').is_file()
Path('/tmp').is_socket)()
Path('/tmp').is_block()
Path('sr0').is_block() #是否是块设备

绝对路径

!ln -sv test3 slink
Path('slink').absolute() #只能显示软链接的绝对路径
Path('slink').resolve()  #显示软链接下的源文件的绝对路径,若不是软链接,也显示绝对路径
通配符
- glob(pattern)通配给定的模式,返回生成器对象
- rglob(pattern)通配给定的模式,递归目录,返回生成器对象
- ?表示一个字符
- *表示任意字符
- [abc]或[a-z]表示给定范围内的一个字符
p1 = Path('/home/python/projects/test369/pythons/xjwlearn/for_practice_anything')
print(p1.glob('*.txt')) #<generator object Path.glob at 0x7f56ee751d58>生成器对象
print(list(p1.glob('*.txt'))) #[PosixPath('/home/python/projects/test369/pythons/xjwlearn/for_practice_anything/untitled.txt')]返回列表

Path('a')
Path('a').exists()
Path('a').glob('*.gz') #这样不会递归查找

#递归查找
list(Path('a').glob('**/*')) #递归所有目录的所有文件,同rglob
list(Path('a').rglob('*.gz')) #递归匹配所有目录下.gz结尾的文件

其他操作

rmdir() 删除空目录。没有提供判断目录为空的方法
touch(mode=0o666, exist_ok=True) 创建一个文件
as_uri() 将路径返回成URI,例如'file:///etc/passwd'
mkdir(mode=0o777, parents=False, exist_ok=False)
parents,是否创建父目录,True等同于mkdir -p。False时,父目录不存在,则抛出
FileNotFoundError
exist_ok参数,在3.5版本加入。False时,路径存在,抛出FileExistsError;True时,
FileExistsError被忽略
iterdir() 迭代当前目录,不递归
 Path('test4').stat() #显示文件属性
 Path('slink').stat() #显示源文件的属性
 Path('slink').lstat() #显示软连接的属性
shutil模块

copy复制

copyfileobj(fsrc, fdst[, length]) #文件对象的复制,length指定buffer的大小 
copyfile(src, dst, *, follow_symlinks=True)  #复制文件内容,不含元数据
copymode(src, dst, *, follow_symlinks=True) #复制权限
copystat(src, dst, *, follow_symlinks=True)#复制元数据,stat包含权限

copy(src, dst, *, follow_symlinks=True)  
复制文件内容、权限和部分元数据,不包括创建时间和修改时间。
本质上调用的是
copyfile(src, dst, follow_symlinks=follow_symlinks)
copymode(src, dst, follow_symlinks=follow_symlinks)

copy2  比copy多了复制全部元数据,但需要平台支持。
本质上调用的是
copyfile(src, dst, follow_symlinks=follow_symlinks)
copystat(src, dst, follow_symlinks=follow_symlinks)

rm

shutil.rmtree(path, ignore_errors=False, onerror=None)
递归删除。如同rm -rf一样危险,慎用。
它不是原子操作,有可能删除错误,就会中断,已经删除的就删除了。
ignore_errors为true,忽略错误。当为False或者omitted时onerror生效。
onerror为callable,接受函数function、path和execinfo。
shutil.rmtree('O:/tmp') # 类似 rm -rf

move移动

move(src, dst, copy_function=copy2)
递归移动文件、目录到目标,返回目标。
本身使用的是 os.rename方法。
如果不支持rename,如果是目录则copytree再删除源目录。
默认使用copy2方法。
shutil.move('o:/a', 'o:/aaa')
os.rename('o:/t.txt','o:/temp/t')
os.rename('test3','/tmp/py/test300')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值