路径操作

1, os.path模块 :from os import path
from os import path
from pathlib import Path

p1=Path('D:\download\work')
p = path.join('/a', 'sysconfig', 'abs','network')   #拼接

print(path.exists(p1))# 判断路径是否存在
# path.exists(p1)
# p1.exists()
print(path.exists(p))
print(p,type(p))
-------------------------------------------------
True
False
/a\sysconfig\abs\network <class 'str'>
p = path.join('/a', 'sysconfig', 'abs','network')
b = path.split(p)                                  #路径分割,返回的是路径和基名的tuple
a = "abcd"

print(a.split("b"))                                #字符串分割返回的是列表
print(b,type(b))
----------------------------------------
['a', 'cd']
('/a\\sysconfig\\abs', 'network') <class 'tuple'>
print(path.dirname(p),path.basename(p))  # 路径和基名  返回值是str类型
print(type(path.dirname(p)),type(path.basename(p)))
----------------------------------------
/a\sysconfig\abs network
<class 'str'> <class 'str'>
cd D:\download\work  # 切换路径
----------------------------------------
D:\download\work
print(path.splitdrive('D:\download\MobileFile\thumb'))  #返回逻辑驱动器和路径
----------------------------------------
('D:', '\\download\\MobileFile\thumb')
p1 = path.abspath('__file__')   #绝对路径下的文件
print(p1)
while p1 != path.dirname(p1):    
    dirname = path.dirname(p1)    
    print(dirname)   
    p1 = dirname
----------------------------------------
D:\download\work\__file__
D:\download\work
D:\download
D:\
2, pathlib模块
  • 初始化
p = Path() # 当前目录, Path()、Path('.')、Path('')  
p = Path('a',   'b',   'c/d') # 当前目录下的a/b/c/d  
p = Path('/etc') # 根下的etc目录  
  • 路径拼接和分解
    • 操作符/
    • Path对象 / Path对象
    • Path对象 / 字符串或者字符串 / Path对象
    • 分解parts属性,可以返回路径中的每一个部分joinpath
    • joinpath(*other) 连接多个字符串到Path对象中
p = Path()
p = p / "a"
p1 = "b" / p
p2 = Path('c')
p3 = p2 / p1
print(p3, p3.parts)     
print(p3.joinpath('etc','int.d',Path('httpd')))   #路径拼接
-----------------------------------------------------
c\b\a ('c', 'b', 'a')
c\b\a\etc\int.d\httpd
  • 获取路径
    • str 获取路径字符串
    • bytes 获取路径字符串的bytes
p = Path('/etc')
print(str(p), bytes(p))
-----------------------------------------------------
\etc b'\\etc'
  • 父目录parent
    • 目录的逻辑父目录
    • parents 父目录序列,可迭代对象,索引0是直接的父
p = Path('/a/b/c/d')

print(p.parent.parent)
for x in p.parents:    
    print(x)
-----------------------------------------------------
\a\b
\a\b\c
\a\b
\a
\
p = Path("f:/work/002/a/b/c/d/e/f/g/h/i")
p.mkdir(parents=True,exist_ok=True)
p1 = p.parents[1]
p2 = p.parents[2]
p3 = p.parents[3]
print(p1)
print(p2)
print(p3)
-----------------------------------------------------
f:\work\002\a\b\c\d\e\f\g
f:\work\002\a\b\c\d\e\f
f:\work\002\a\b\c\d\e
  • 目录组成部分name、stem、suffix、suffixes、with_suffix(suffix)、with_name(name)

    • name 目录的最后一个部分
    • suffix 目录中最后一个部分的扩展名
    • stem 目录最后一个部分,没有后缀
    • name = stem + suffix
    • suffixes 返回多个扩展名列表
    p = Path('/work/mysqlinstall/mysql.tar.gz')  
    print(p.name)  
    print(p.suffix)  
    print(p.suffixes)  
    print(p.stem)  
    -----------------------------------------------------
    mysql.tar.gz  
    .gz  
    ['.tar', '.gz']  
    mysql.tar  
    
    • with_name(name) 替换目录最后一个部分并返回一个新的路径
    • with_suffix(suffix) 有扩展名则替换,无则补充扩展名
    print(p.with_name('mysql-5.tgz'))
    print(p.with_suffix('.png'))
    -----------------------------------------------------
    \work\mysqlinstall\mysql-5.tgz       #替换目录最后一个部分
    \work\mysqlinstall\mysql.tar.png     #有扩展则替换
    
    p = Path('README')
    print(p)
    print(p.with_suffix('.txt'))
    -----------------------------------------------------
    README
    README.txt                 # 无扩展名则补充
    

  • 全局方法
    • cwd() 返回当前工作目录
    • home() 返回当前家目录
    cd F:/work/001
    ----------------------------------------------------- 
    F:\work\001
    
    p.home()
    -----------------------------------------------------  
    WindowsPath('C:/Users/win7')
    
    p.cwd()
    -----------------------------------------------------  
    WindowsPath('F:/work/001')
    

  • 判断方法

    • exists() 目录或文件是否存在
    • is_dir() 是否是目录,目录存在返回True
    • is_file() 是否是普通文件,文件存在返回True
    px = Path('F:/work/001/')
    py = Path('F:/work/001/123.ini')
    pz = Path('c/d/f')
    
    px.is_dir(), px.is_file(), py.is_dir(), py.is_file(), pz.exists()
    ----------------------------------------------------- 
    (True, False, False, True, False)
    
    • is_symlink() 是否是软链接
    • is_socket() 是否是socket文件
    • is_block_device() 是否是块设备
    • is_char_device() 是否是字符设备
    • is_absolute() 是否是绝对路径
    px.is_symlink(),  pz.is_socket(),  pz.is_block_device(),  px.is_char_device(),  px.is_absolute()
    ----------------------------------------------------- 
    (False, False, False, False, True)
    

  • 绝对路径
    • resolve() 非Windows,返回一个新的路径,这个新路径就是当前Path对象的绝对路径,如果是软链接则直接被解析。
    • absolute() 获取绝对路径
    p.absolute()
    ----------------------------------------------------- 
    WindowsPath('F:/work/001')
    
    • rmdir() 删除空目录。没有提供判断目录为空的方法
    p1 = Path("f:/work/002/a/b/c/d/e/f")  # 删除 f 必须是空目录
    p1.rmdir()
    
    • touch(mode=0o666, exist_ok=True) 创建一个文件 ,mode 权限
    p1 = Path("f:/work/002/a/b/c/d/e/")   # 第一步 先设置路径
    p1.mkdir(mode=0o777,parents=True,exist_ok=True) #第二步 先创建文件夹
    p1 = Path("f:/work/002/a/b/c/d/e/A.txt")   # 第三步 在e文件夹下创建文件A.txt
    p1.touch(mode=0o666, exist_ok=True)
    p1 = Path("f:/work/002/a/b/c/d/e/x.exe")  # 创建的x.exe是文件夹
    
    • 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被忽略
    p1 = Path("f:/work/002/a/b/c/d/e")
    p1.mkdir(mode=0o666, parents=True, exist_ok=True)
    -----------------------------------------------------
    ## F:\work\002\a\b\c\d\e,电脑中按顺序新建文件夹
    
    • iterdir() 迭代当前目录(用for循环查看当前目录,查看当前目录所有的文件和文件),不递归,
    from pathlib import Path
    from os import path
    p = Path("F:/work/002/a/b/c/d/e/f/g/h")
    p.mkdir(mode =0o777,parents=True,exist_ok=True)
    p.touch()
    p1 = p.parents[6]
    for x in p1.iterdir():                  # 等价于glob.glob(F:/work/002/a/*)
        # print(path.basename(x))
        print(x.name) 
    
    -----------------------------------------------------
    abc - 副本.txt
    abc.txt
    b                   #文件夹
    
    
    判断目录文件夹下的文件是空目录还是文件
    p = Path("F:/work/002/a/b/c/d/e/f/g/h")
    for x in p.iterdir():
        if x.is_dir():
            for y in x.iterdir():
                print("dir:",x.name,"is not empty")
                break
        else:
            x.is_file()
            print("file:",x.name)
    -----------------------------------------------------
    dir: i is not empty   # h文件夹下的i文件夹,不为空
    file: Pointofix.exe   # h文件夹下的文件 Pointofix.exe
    

  • 通配符

    • glob(pattern) 通配给定的模式
    import glob
    glob.glob('F:/work/002/a/*',recursive=True)
    --------------------------------------------
    ['F:/work/002/a\\abc - 副本.txt', 'F:/work/002/a\\abc.txt', 'F:/work/002/a\\b']
    
    
    import glob
    glob.glob('*',recursive=True)        #此方法也可以查看当前目录下的所有的文件和文件夹,返回列表
    --------------------------------------------
    ['abc - 副本.txt', 'abc.txt', 'b']
    
    • rglob(pattern) 通配给定的模式,递归目录都返回一个生成器
    • ? 代表一个字
    g = p.rglob('*.???')  #匹配扩展名为3个字符的文件  返回的是生成器
    
    • 符* 表示任意个字符
    list(p.glob('*.txt'))   #遍历当前目录下所有的以.txt为后缀的文件
    list(p.glob("**/*.txt") #遍历当前目录下所有的子目录内的以.txt为后缀的文件
    list(p.glob("**/*"))    #遍历当前目录下所有的子目录和文件
    
    
    • [abc]或[a-z] 表示一个字符
    list(p.rglob('[a-z]*.???')) # 匹配字母开头的且扩展名是3个字符的文件
    
  • 匹配

    • match(pattern) 模式匹配,成功返回True
    Path('a/b.py').match('*.py') # True
    Path('/a/b/c.py').match('b/*.py') # True
    Path('/a/b/c.py').match('a/*.py') # False
    Path('/a/b/c.py').match('a/*/*.py') # True
    Path('/a/b/c.py').match('a/**/*.py') # True
    Path('/a/b/c.py').match('**/*.py') # True
    
    • stat() 相当于stat命令lstat()
    • 同stat(),但如果是符号链接,则显示符号链接本身的文件信息

  • 文件操作
    • 使用方法,类似内建函数open。返回一个文件对象
    Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)  
    
    • 3.5增加的新函数,
    • Path.read_bytes() 以’rb’读取路径对应的文件,并返回二进制流
    • Path.read_text(encoding=None,errors=None) 以’rt’方式读取路径对应文件,返回文本
    • Path.write_bytes(data) 以’wb’方式写入数据到路径对应文件。
    • Path.write_text(data, encoding=None,errors=None) 以’wt’方式写入字符串到路径对应文件

os模块
  • os.listdir(‘o:/temp’)
  • 返回指定目录内容列表,不递归。
p = Path('f:/work/001/a/b/c/d/')
os.listdir('f:/work/001/a')
--------------------------------------------
['asoy.txt', 'b']    #文件夹a下有文件saoy.txt和文件夹b,返回的是列表
  • os也有open、read、write等方法,但是太底层,建议使用内建函数open、read、write,使用方式相似。

  • os.stat(path, *, dir_fd=None, follow_symlinks=True)

  • 本质上调用Linux系统的stat。

  • path:路径的string或者bytes,或者fd文件描述符

  • follow_symlinks True返回文件本身信息,False且如果是软链接则显示软链接本身。对于软链接本身,可以使用os.lstat方法

  • os.chmod(path, mode, *, dir_fd=None, follow_symlinks=True) os.chmod(‘test’,0o777)

  • os.chown(path, uid, gid)

  • 改变文件的属主、属组,但需要足够的权限

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值