路径操作模块
3.4版本之前
os.path模块
#os模块常用函数
from os import path
p = path.join('/etc','sysconfig','network')#拼接路径
print(type(p),p)#字符串类型
print(path.exists(p))#路径是否存在
print(path.dirname(p),path.basename((p)))#路径和基名
print(path.split(p))#分割出路径和基名
print(path.abspath(''),path.abspath('.'))#解释器当前工作路径的绝对路径
print(path.splitdrive)#windows方法,分割出解释器工作路径的盘符,路径
#逐级打印父目录
p = path.abspath(path.join('a/b/b/c'))
while path.basename(p):
p = path.dirname(p)
print(p)
3.4版本开始
建议使用pathlib模块,提供path对象来操作。包括目录和文件。
pathlib模块
from pathlib import Path#Path首字母大写
目录操作
初始化
p = Path()#当前目录,Path(),Path(''),Path('.')
p = Path('a','b/c','d\e',)#返回当前系统path对象,WindowsPath('a/b/c/d/e')
p = Path('/a','b','d','e')#WindowsPath('/a/b/d/e')
p = Path('a','\b/c','d','e')#WindowsPath('a/\x08/c/d/e')
p = Path('a','\\b','d','e')#WindowsPath('/b/d/e')
p = Path('a','/b','d','e')#WindowsPath('/b/d/e')
p = Path('/a','/b','d','e')#WindowsPath('/b/d/e')
p = Path('/a','b','\/\/\/d','e')#WindowsPath('/d/e')
p = Path('a/b',Path('c','d','/e'))#WindowsPath('/e')
路径拼接和分解
操作符 /
Path对象 / Path对象
Path对象 / 路径字符串,路径字符串 / Path对象
注意:‘ / ’本意是双目运算符中的除法运算,当遇到非数字类型操作时,解释器会做运算符重载,比如像字符串相加’a’ + ‘b’ =>‘ab’,或者列表相加,[2] + [4] =>[2,4]。当然这里也以像 ‘+=’ 一样用‘/=’意味着就地修改
分解
parts属性,返回Path object中的每一个部分
p = Path('/a/b',Path('c')).parts#返回元组('\\', 'a', 'b', 'c')
joinpath
joinpath(*other)在当前Path路径上链接多个字符串或Path对象,返回新路径对象
p = Path('/a/b',Path('c')).joinpath('a',Path('bbb'))#WindowsPath('/a/b/c/a/bbb')
获取路径
str获取路径字符串
bytes获取路径字符串的bytes
p = Path('/a/b',Path('c')).joinpath('a',Path('bbb'))
print(p,str(p),bytes(p),sep = '\t')
#\a\b\c\a\bbb \a\b\c\a\bbb b'\\a\\b\\c\\a\\bbb'
#由于print内部会把其参数装换成str类型输出到屏幕,所以print(p)和print(str(p))结果是一样的
父目录
parent目录的逻辑父目录
parents父目录,惰性可迭代对象,能用索引和for驱动,索引0是直接的父目录。
p = Path('/a/b',Path('c')).joinpath('a',Path('bbb')).parent
p1 = Path('/a/b',Path('c')).joinpath('a',Path('bbb')).parents
p,p1[0],p1
#(WindowsPath('/a/b/c/a'), WindowsPath('/a/b/c/a'), <WindowsPath.parents>)
目录组成部分
name,stem,suffix,suffixes,with_suffix(suffix),with_name(name)
name 目录的最后一部分
suffix 目录中最后一部分的扩展名(后缀)
stem 目录的最后一部分,没有(扩展名)后缀
name = stem + suffix
p1 = Path('a/b/d.txt')
print(f'{p1.name}@@{p1.suffix}@@{p1.stem}')
p0 = Path('a/b/c')
print(f'{p0.name}@@{p0.suffix}@@{p0.stem}')
#d.txt@@.txt@@d
#c@@@@c
suffixes 返回多个扩展名的列表
p1 = Path('a/b.txt.zip')
p1.suffixes,p1.stem,p1.suffix,p1.name
#(['.txt', '.zip'], 'b.txt', '.zip', 'b.txt.zip')
with_suffix(suffix) Path对象有扩展名就替换,没有就补充
p0 = Path('/a/c')
p1 = Path('/a/b.txt')
p0.with_suffix('.py'),p1.with_suffix('.py')
#(WindowsPath('/a/c.py'), WindowsPath('/a/b.py'))
with_name(name) 替换目录最后一部分
p0 = Path('/a/c')
p0.with_name('b'),p0.with_name('c.py')
#(WindowsPath('/a/b'), WindowsPath('/a/c.py'))
全局方法
cwd() 返回当前工作目录
home() 返回当前家目录
判断文件类型方法
exists() 目录是否存在
is_dir() 是否是目录,目录存在返回True,不存在或不是目录返回False
is_file() 是否是文件,文件存在返回True,不存在或不是文件返回False
is_socket() 是否socket文件
is_symlink() 是否是软连接
is_block_device() 是否是块设别
is_char_device() 是否是字符设备
iss_absolute() 是否是绝对路径
注意:文件落地后才知道它是什么类型
绝对路径
resolve() 非windows,返回一个新的路径,这个路径就是就是当前Path对象的绝对路径,如果是软连接则直接被解析。
absolute() 获取绝对路径。
mkdir(mode=0o644,parents=False,exist_ok=False)
touch(mode=0o777,exist_ok=True)
参数parents=True等同于mkdir -p
参数exist_ok在3.5版本中加入,exist_ok=True对象存在不报错
as_uri() 将路径返回成url,必须使用绝对路径
Path('a/b/c').absolute().as_uri()
#'file:///D:/TEST/a/b/c'
iterdir() 迭代当前目录,不递归
rmdir() 删除空目录,没有提供判断目录为空的方法,如要判断目录是否为空可以用iterdir去
p = Path('a/b/c')
p.mkdir(mode=0o644,parents=True,exist_ok=True)
p1 = Path('a/b/c.txt')
p1.touch()
p2 = p.parent.absolute().iterdir()
for path in p2:
if path.is_dir():
print('{} is directory'.format(path.name))
for i in path.iterdir():
print('{} is directory'.format(i))
elif path.is_file():
print(f'{path.name} is file')
#c is directory
#D:\TEST\a\b\c\新建文件夹 is directory
#c.txt is file
通配符
glob(pattern) 以给的的模式匹配,返回生成器
rglob(pattern) 以给的的模式匹配,递归目录,返回生成器
?代表一个字符
*代表任意个字符
[abc]或[a-c] 表示abc中的任意一个字符
list(Path('').glob('?'))#返回当前工作目录下文件Path.name长度为1个字符的文件
list(Path('.').glob('*/*'))#返回当前工作目录下的所有目录下的文件
list(Path().glob('**'))#递归当前工作目录下的所有文件,等同rglob
匹配
match(pattern) 模式匹配,成功返回True
p = Path('a/b/c.bafff').absolute()
p.match('a/*baff*')#从当前工作目录下的a目录匹配,返回False
p.match('**/*baff*')#从当前工作目录下递归匹配,返回True
stat() 相当于stat命令
lstat() 相当于stat(),但如果是符号链接,则显示符号链接本身的文件信息
p.stat()
#os.stat_result(st_mode=33206, st_ino=4503599627381724, st_dev=4352747, st_nlink=1, #st_uid=0, st_gid=0, st_size=0, st_atime=1568355821, st_mtime=1568355821, #st_ctime=1568355821)
文件操作
Path.open(mode=‘r’,buffering=-1,encoding=None,errors=None,newline=None)
使用方法类似内建函数open。返回一个对象
3.5增加的新函数
Path.read_bytes()
Path.read_text(encoding=None,errors=None)
Path.write_bytes(data)
Path.write_text(data,encoding=None,errors=None)
os模块
操作系统平台
os.name#windows=>nt,linux=>posix
os.uname# *nix支持
sys.platform#windows=>win32,linux=>linux
os.listdir(‘d:/’) 不递归显示d盘下的文件
os.stat(path,*,dir_fd=None,follow_symlink=True)
os.stat(path, *, dir_ fd=None, follow_ symlinks=True)
本质上调用Linux系统的stat。
path:路径的string或者bytes,或者fd文件描述符
follow_ symlinks True返回文件本身信息,False且如果是软链接则显示软链接本身。对于软链接本身,可以使用os.Istat方法。
os.chmod(path,mode,*,dir_fd=None,follow_symlink=True)
os.chmod(‘test’,0o777)
os.chmod(path,uid,gid) 改变文件属主,属组,