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\network 5 6 p = path.join('/etc','sysconfig','network') 7 print(type(p), p) # <class 'str'> 字符串 : '/etc\sysconfig\network' 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:\Users\Administrator\Desktop\program 17 print(path.abspath('a')) # C:\Users\Administrator\Desktop\program\a 18 print(path.abspath('./a'))# C:\Users\Administrator\Desktop\program\a 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:/etc\sysconfig\network\test.txt 24 print(path.dirname(p)) # o:/etc\sysconfig\network 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_pycharm\code_test_daye\homework_解析_8-31.py homework_解析_8-31.py 38 # E:\code_pycharm\code_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/b\c') 19 print(p) # a\b\c 20 p = Path('/a/b\c') # 却别Windows 和linux 21 print(p) 22 print(p.absolute()) 23 # \a\b\c 24 # C:\a\b\c 25 26 # / 运算符重载,但是不覆盖P 27 print(p / 'c') 28 print(p) 29 # \a\b\c\c 30 # \a\b\c 31 32 print(p / 'c'/ 'd') # \a\b\c\c\d 33 34 print(p)# \a\b\c 可以看出绝对路径是不能拼接的,左侧 35 print('x'/ p) # \a\b\c 36 print('y' / ('x' / p )) # # print('y' / 'x' / p ) #报错 37 38 p = Path('a/b') 39 print(p) 40 print('x'/ p) # x\a\b 41 print('y' / ('x' / p ))# y\x\a\b 42 43 p1 = p / 's' 44 print(p / p1) 45 46 47 print('------分解--------') 48 print(p.absolute()) # C:\Users\Administrator\Desktop\program\a\b 49 print(p)# a\b 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')) # a\b\x\y\x\a\b\a\b\a 也就是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 # a\bv 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\b 72 # a\b 73 print('--------------') 74 print(p) 75 print(p.parent) 76 print(p.absolute().parent ) 77 # a\b 78 # a 79 # C:\Users\Administrator\Desktop\program\a
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 # a\b\s\a ----- 13 # a\b\s 14 # a\b 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 # \mage\mysql\a.gz 45 # \mage\mysql\mysq.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 # a\a\abc 58 # a\abc 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:\Users\Administrator\Desktop\program 70 # C:\Users\Administrator 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='\t') 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='\t') 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()
为什么要坚持,想一想当初!