zoukankan      html  css  js  c++  java
  • Python-路径操作

    1、3.4 版本之前:os.path 模块

     1 from os import path
     2 
     3 p = path.join('/etc','/sysconfig','network') #注意不同!!!!!
     4 print(type(p), p)  # <class 'str'> /sysconfig
    etwork 
     5 
     6 p = path.join('/etc','sysconfig','network')
     7 print(type(p), p) # <class 'str'>    字符串 : '/etcsysconfig
    etwork' 
     8 # windows 和linux 都是可以使用 / 但是win默认  linux /   
     9 #当前在win下测试,除了第一个 /
    10 
    11 print(path.exists(p))
    12 
    13 print(path.split(p)) # ('/etc\sysconfig', 'network') # 按照最后一个分隔符切,相当于rpartation 字符串
    14 
    15 # 相对路径---》 绝对路径
    16 print(path.abspath('.')) # C:UsersAdministratorDesktopprogram
    17 print(path.abspath('a')) # C:UsersAdministratorDesktopprograma
    18 print(path.abspath('./a'))# C:UsersAdministratorDesktopprograma
    19 print(path.abspath('/a')) # C:a    print(path.abspath('/a')) ---> linux 返回 ‘/a’
    20 
    21 
    22 p = path.join('o:/' , p, 'test.txt')
    23 print(p) # o:/etcsysconfig
    etwork	est.txt
    24 print(path.dirname(p)) # o:/etcsysconfig
    etwork
    25 print(path.basename(p)) # test.txt
    26 #只在win下用,linux没有盘符驱动
    27 print(path.splitdrive(p))# ('o:', '/etc\sysconfig\network\test.txt')
    28 
    29 
    30 # 一层一层取出来路径
    31 p1 = path.abspath(__file___)
    32 print(p1, path.basename(p1))
    33 while p1 !=path.dirname(p1):
    34     p1 = path.dirname(p1)
    35     print(p1, path.basename(p1))
    36     
    37 # E:code_pycharmcode_test_dayehomework_解析_8-31.py homework_解析_8-31.py
    38 # E:code_pycharmcode_test_daye code_test_daye
    39 # E:code_pycharm code_pycharm
    40 # E: 

     2、pathlib模块(推荐使用,3.4之后)

     1 from pathlib import Path
     2 #当前目录,也叫初始化
     3 p = Path()# 大写
     4 print(p, '---')
     5 p = Path('.')
     6 print(p, '---')
     7 p = Path('./')
     8 print(p, '---')
     9 
    10 # . ---
    11 # . ---
    12 # . ---
    13 
    14 # 路径拼接和分解:
    15 
    16 p = Path('a')
    17 print(p) # a
    18 p = Path('a/bc')
    19 print(p) # ac
    20 p = Path('/a/bc') # 却别Windows 和linux
    21 print(p)
    22 print(p.absolute())
    23 # ac
    24 # C:ac
    25 
    26 # / 运算符重载,但是不覆盖P
    27 print(p / 'c')
    28 print(p)
    29 # acc
    30 # ac
    31 
    32 print(p / 'c'/ 'd') # accd
    33 
    34 print(p)# ac  可以看出绝对路径是不能拼接的,左侧
    35 print('x'/ p) # ac
    36 print('y' / ('x' / p )) # # print('y' / 'x' / p ) #报错
    37 
    38 p = Path('a/b')
    39 print(p)
    40 print('x'/ p) # xa
    41 print('y' / ('x' / p ))# yxa
    42 
    43 p1 = p / 's'
    44 print(p / p1)
    45 
    46 
    47 print('------分解--------')
    48 print(p.absolute()) # C:UsersAdministratorDesktopprograma
    49 print(p)# a
    50 print(p.parts)# ('a', 'b')
    51 print(p.absolute().parts) # ('C:\', 'Users', 'Administrator', 'Desktop', 'program', 'a', 'b')
    52 
    53 print('--------------')
    54 print(p.joinpath('x','y/x',p, p/'a')) #  axyxaaa  也就是p + 后面的
    55 
    56 
    57 print('--------------')#注意斜杆
    58 print(str(p) + 'v') # 字符串拼接,只要加str强转,才能得到字符串,否则是pathilb对象
    59 print(bytes(p) + b's') 
    60 
    61 print(bytes(p) + b's') 
    62 print(bytes(p) + b'\s')
    63 # av
    64 # b'a\bs' # 转义了
    65 # b'a\b\s'
    66 # b'a\b\s'
    67 print('--------------')
    68 
    69 print(p)
    70 print(str(p))
    71 # a
    72 # a
    73 print('--------------')
    74 print(p)
    75 print(p.parent)
    76 print(p.absolute().parent )
    77 # a
    78 # a
    79 # C:UsersAdministratorDesktopprograma
      1 print('--------------')
      2 print(p) # 'a/b'
      3 l = p.parents
      4 print(p.parents)# 可迭代对象, 从父到父的父 依次类推,可以获取所有 的父路径 # <WindowsPath.parents>
      5 print(p.absolute().parents) #获取所有非父路径
      6 # p = p / 's'/'a'
      7 # print(p,'-----')
      8 # l = p.parents
      9 # for i in l:
     10 #     print(i)
     11 
     12 # asa -----
     13 # as
     14 # a
     15 # a
     16 # . #最远到当前目录
     17 
     18 print('--------------')
     19 
     20 # 目录组成部分:
     21 # p1.name,         p1.stem, p1.suffix ,p1,suffixes  
     22 # 文件名包括后缀,文件名, 后缀(最后一个点),多级的后缀
     23 # 这里说文件名是准确的,谁知道最后是不是文件,不能单单看后缀
     24 #name:目录的最后一部分
     25 #suffix:目录中最后一个部分的扩展名
     26 # stem 目录最后一个部分,没有后缀,多个后缀,不包括最后一个后缀,a.ga.tar -----a.ga
     27 # suffixes 返回多个扩展列表
     28 # with_suffix(suffix)有扩展名则替换,没有补充扩展名,返回一个新路径
     29 # with_name(name)替换目录最后一个部分并返回一个新的路径
     30 p = Path('/mage/mysql/mysq.tar.gz')
     31 print(p.name)
     32 print(p.suffix)
     33 print(p.suffixes)
     34 print(p.stem)
     35 print(p.with_name('a.gz'))
     36 print(p.with_suffix('.jgp'))
     37 p = Path('README')
     38 print(p.with_suffix('.txt'))
     39 
     40 # mysq.tar.gz
     41 # .gz
     42 # ['.tar', '.gz']
     43 # mysq.tar
     44 # magemysqla.gz
     45 # magemysqlmysq.tar.jgp
     46 # README.txt
     47 # 如果 p = Path('a/a/test')  --->  'test', 'test', ''
     48 
     49 print('--------------')
     50 # 换basename
     51 p1 = Path('a/a/test')
     52 
     53 print(p1.with_name('abc')) # 
     54 
     55 print(p1.parent.with_name('abc'))
     56 
     57 # aaabc
     58 # aabc
     59 
     60 print('--------------')
     61 # p.cwd() # 路劲对象的方法
     62 # pwd
     63 # p.pwd()
     64 # Path.cwd() #  路径类的方法调用
     65 # # 对象可以调用类上的方法的!!!!!
     66 p = Path('a/b/c')
     67 print(p.cwd())# pwd 全局方法
     68 print(p.home())#全局方法
     69 # C:UsersAdministratorDesktopprogram
     70 # C:UsersAdministrator
     71 
     72 
     73 print('--------------')
     74 # is
     75 # 判断的前提是要存在! 否则都是False
     76 p.is_file()
     77 p.is_dir()
     78 
     79 p.is_symlink()#软链接
     80 p.is_socket()
     81 p.is_block_device()
     82 p.is_char_device()
     83 # 针对软链接
     84 p1.absolute() #软链接的路径
     85 p1.resolve() # 被链接文件的路径
     86 
     87 #不存在文件一定没有类型
     88 p1.exists() # 先确定是否存在(目录或文件)
     89 
     90 Path('/rm/test1').rmdir()#  这能删除空文件夹
     91 
     92 Path('/rm/').touch(mode=0o666) # 创建,一般使用open,不用这个,有时候需要先创建多个文件,这个时候可以touch,再写内容
     93 
     94 Path('/rm/').touch(exist_ok=True)# 规避异常,如果存在就存在,不报异常
     95 
     96 
     97 Path('/rm/').as_uri() # 将路径返回成URL 如:'file:///etc/passwd'
     98 
     99 
    100 print('--------------')
    101 p = Path('a/b/c/d')
    102 p.mkdir(parents=True) # 等价linux 中mkdir -p
    103 # 3/5 之后才有的exist_ok 参数
    104 p.touch(exist_ok=True) #存在就ok了,不需要报异常,压制异常
    105 
    106 
    107 Path('/tmp/').iterdir() # 生成器
    108 
    109 list(Path('/tmp/').iterdir()) # 把当前目录下的文件,包括目录列出来,但不会迭代显示里边的目录
    110 
    111 # 递归一定是函数#
    112 #把遍历封装成递归函数 
    113 # 遍历,并判断文件类型,如果是目录是否可以判断其是否为空
    114 for x in p.parents[len(p.parents)-1].iterdir():
    115     print(x, end='	')
    116     if x.is_dir():
    117         flag=False
    118         for _ in x.iterdir():
    119             flag = True
    120             break
    121             
    122         print('dir','not Empty' if flag else 'empty',sep='	')
    123     elif x.is_file():
    124         print('file')
    125     else:
    126         print('other file')
    from pathlib import Path
    p = Path('a/b/c')
    
    print('------------------------')
    # 通配符:
    print(list(Path('e:/').glob('*.py'))) # <generator object Path.glob at 0x00000000050BF228>
    
    p3 = Path('E:/Pycharm_代码/note')
    print(p3)
    print(list(p3.glob('*.py'))) # 生成器
    print(list(p3.glob('*/*.py'))) # 生成器 还是下一层 
    
    print( list(p3.glob('**/*.py'))) # 生成器 所有层,目录递归 ** 表示任意层,可以为0
    print( list(p3.rglob('*.log'))) # 递归找
    
    
    
    # linux上测试:
    In [1]: from pathlib import Path
    
    In [2]: p = Path()
    
    In [3]: p
    Out[3]: PosixPath('.')
    
    In [4]: p.absolute()
    Out[4]: PosixPath('/home/py/jerry/projects/web')#web下有a/b/c/d
    
    In [5]: list(p.glob('*.log'))
    Out[5]: []
    
    In [6]: list(p.glob('*/*.log'))
    Out[6]: [PosixPath('a/a.log')]
    
    In [7]: list(p.glob('**/*.log'))
    Out[7]: [PosixPath('a/a.log'), PosixPath('a/b/b.log'), PosixPath('a/b/c/d/d.log')]
    
    In [8]: list(p.glob('*/**/*.log'))
    Out[8]: [PosixPath('a/a.log'), PosixPath('a/b/b.log'), PosixPath('a/b/c/d/d.log')]
    
    print('---------匹配------------------')
    
    # 匹配
    In [9]: Path('a/a.log').match('*log')
    Out[9]: True
    
    In [10]: Path('a/b/b.log').match('*.log')
    Out[10]: True
    
    print('---------stat------------------')
    # stat() lstat()
    
    Path('t1').stat()
    Path('t1').lstat()
    print(st.st_mode,type(st.st_mode)) 可以通过点来调用
    lrwxrwxrwx. 1 py py 5 Sep 5 17:22 aa.log -> a.log In [26]: p = Path('a.log') In [27]: p.stat() Out[27]: os.stat_result(st_mode=33204, st_ino=1057508, st_dev=64771, st_nlink=1, st_uid=500, st_gid=500, st_size=0, st_atime=1536138300, st_mtime=1536138300, st_ctime=1536138300) In [28]: oct(33204) Out[28]: '0o100664' In [29]: p.lstat() Out[29]: os.stat_result(st_mode=33204, st_ino=1057508, st_dev=64771, st_nlink=1, st_uid=500, st_gid=500, st_size=0, st_atime=1536138300, st_mtime=1536138300, st_ctime=1536138300) In [30]: Path('aa.log').stat() Out[30]: os.stat_result(st_mode=33204, st_ino=1057508, st_dev=64771, st_nlink=1, st_uid=500, st_gid=500, st_size=0, st_atime=1536138300, st_mtime=1536138300, st_ctime=1536138300) In [31]: Path('aa.log').lstat() Out[31]: os.stat_result(st_mode=41471, st_ino=1057511, st_dev=64771, st_nlink=1, st_uid=500, st_gid=500, st_size=5, st_atime=1536139338, st_mtime=1536139337, st_ctime=1536139337) In [32]: oct(41471) Out[32]: '0o120777' # 可以看出,stat()相当于stat命令 # lstat()同stat() ,但是如果符号链接文件,则显示的是符号链接的 print('----------文件操作------------------') # 文件操作 f = Path('o:/test1').open('r+') f1 = Path('o:/test') p.write_text('ads') # 默认是w模式,而且不能修改 # p.write_bytes(b'a') 17:38 GBK?????? #linux测试  In [49]: f = Path('a/a.log').open(mode='r', buffering=-1,encoding=None,errors=None, newline=None) In [50]: f Out[50]: <_io.TextIOWrapper name='a/a.log' mode='r' encoding='UTF-8'> In [51]: f.close() In [52]: Path('a/a.log').read_bytes() Out[52]: b'' # 这里:源代码里写了,使用这些命令,不需要open 和close,原码里写了,,,,,,,临时用 p.read_text() p.write_text() p.read_bytes() p.write_bytes()
      1 from pathlib import Path
      2 p = Path('a/b/c')
      3 
      4 print('------------------------')
      5 # 通配符:
      6 print(list(Path('e:/').glob('*.py'))) # <generator object Path.glob at 0x00000000050BF228>
      7 
      8 p3 = Path('E:/Pycharm_代码/note')
      9 print(p3)
     10 print(list(p3.glob('*.py'))) # 生成器
     11 print(list(p3.glob('*/*.py'))) # 生成器 上一层? 还是下一层?测试
     12 
     13 print( list(p3.glob('**/*.py'))) # 生成器 所有层,目录递归 ** 表示任意层,可以为0
     14 print( list(p3.rglob('*.log'))) # 递归找
     15 
     16 
     17 
     18 # linux上测试:
     19 In [1]: from pathlib import Path
     20 
     21 In [2]: p = Path()
     22 
     23 In [3]: p
     24 Out[3]: PosixPath('.')
     25 
     26 In [4]: p.absolute()
     27 Out[4]: PosixPath('/home/py/jerry/projects/web')#web下有a/b/c/d
     28 
     29 In [5]: list(p.glob('*.log'))
     30 Out[5]: []
     31 
     32 In [6]: list(p.glob('*/*.log'))
     33 Out[6]: [PosixPath('a/a.log')]
     34 
     35 In [7]: list(p.glob('**/*.log'))
     36 Out[7]: [PosixPath('a/a.log'), PosixPath('a/b/b.log'), PosixPath('a/b/c/d/d.log')]
     37 
     38 In [8]: list(p.glob('*/**/*.log'))
     39 Out[8]: [PosixPath('a/a.log'), PosixPath('a/b/b.log'), PosixPath('a/b/c/d/d.log')]
     40 
     41 print('---------匹配------------------')
     42 
     43 # 匹配
     44 In [9]: Path('a/a.log').match('*log')
     45 Out[9]: True
     46 
     47 In [10]: Path('a/b/b.log').match('*.log')
     48 Out[10]: True
     49 
     50 print('---------stat------------------')
     51 # stat() lstat()
     52 
     53 Path('t1').stat()
     54 Path('t1').lstat()
     55 
     56 lrwxrwxrwx. 1 py py    5 Sep  5 17:22 aa.log -> a.log
     57     
     58     
     59     
     60 In [26]: p = Path('a.log')
     61 
     62 In [27]: p.stat()
     63 Out[27]: os.stat_result(st_mode=33204, st_ino=1057508, st_dev=64771, st_nlink=1, st_uid=500, st_gid=500, st_size=0, st_atime=1536138300, st_mtime=1536138300, st_ctime=1536138300)
     64 
     65 In [28]: oct(33204)
     66 Out[28]: '0o100664'
     67 
     68 In [29]: p.lstat()
     69 Out[29]: os.stat_result(st_mode=33204, st_ino=1057508, st_dev=64771, st_nlink=1, st_uid=500, st_gid=500, st_size=0, st_atime=1536138300, st_mtime=1536138300, st_ctime=1536138300)
     70 
     71 In [30]: Path('aa.log').stat()
     72 Out[30]: os.stat_result(st_mode=33204, st_ino=1057508, st_dev=64771, st_nlink=1, st_uid=500, st_gid=500, st_size=0, st_atime=1536138300, st_mtime=1536138300, st_ctime=1536138300)
     73 
     74 In [31]: Path('aa.log').lstat()
     75 Out[31]: os.stat_result(st_mode=41471, st_ino=1057511, st_dev=64771, st_nlink=1, st_uid=500, st_gid=500, st_size=5, st_atime=1536139338, st_mtime=1536139337, st_ctime=1536139337)
     76 
     77 In [32]: oct(41471)
     78 Out[32]: '0o120777'
     79 
     80 # 可以看出,stat()相当于stat命令
     81 # lstat()同stat() ,但是如果符号链接文件,则显示的是符号链接的
     82 
     83 
     84 print('----------文件操作------------------')
     85 # 文件操作
     86 f = Path('o:/test1').open('r+')
     87 
     88 f1 = Path('o:/test')
     89 p.write_text('ads') # 默认是w模式,而且不能修改
     90 # p.write_bytes(b'a') 17:38  GBK??????
     91 
     92 #linux测试
     93 
     94 In [49]: f = Path('a/a.log').open(mode='r', buffering=-1,encoding=None,errors=None, newline=None)
     95 
     96 In [50]: f
     97 Out[50]: <_io.TextIOWrapper name='a/a.log' mode='r' encoding='UTF-8'>
     98 
     99 In [51]: f.close()
    100 
    101 In [52]: Path('a/a.log').read_bytes()
    102 Out[52]: b''
    103     
    104 
    105 # 这里:源代码里写了,使用这些命令,不需要open 和close,原码里写了,,,,,,,临时用
    106 p.read_text()
    107 p.write_text()
    108 p.read_bytes()
    109 p.write_bytes()
    为什么要坚持,想一想当初!
  • 相关阅读:
    poj 2942 Knights of the Round Table(无向图的双连通分量+二分图判定)
    Java序列化的几种方式
    Android 四大组件学习之Service六
    cursor:pointer的意思
    JSP中<base href="<%=basePath%>">的作用
    一篇让Java程序猿随时可以翻看的Oracle总结
    史上最全的javascript知识点总结,浅显易懂。
    史上最全的HTML、CSS知识点总结,浅显易懂。
    css学习归纳总结
    Web前端开发Chrome插件
  • 原文地址:https://www.cnblogs.com/JerryZao/p/9581769.html
Copyright © 2011-2022 走看看