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(p.parent)
print(p.name)
print(p.stem)
print(p.suffix)
print(p.suffixes)
print(p.with_name('redis'))
print(p.with_name('redis').with_suffix('.zip'))
全局方法
- cwd()返回当前工作目录
- 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')
来源:CSDN
作者:ppplaybook
链接:https://blog.csdn.net/weixin_42768584/article/details/104180474