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()

 

posted @ 2018-09-03 23:10  JerryZao  阅读(207)  评论(0编辑  收藏  举报