路径操作

本文介绍了Python中的路径操作,从3.4版本前的os.path模块到3.4版本引入的pathlib模块。重点讲解了pathlib模块的目录操作,包括初始化、路径拼接和分解、获取路径、父目录、目录组成部分等,并涉及到文件类型的判断、绝对路径获取、文件操作等。此外,还提到了os模块的相关操作,如listdir、stat和chmod。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

路径操作模块

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) 改变文件属主,属组,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值