Python的路径操作(os模块与pathlib模块)

时间:2020-12-06 16:43:54

           Python的路径操作(os模块与pathlib模块)

                                      作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.os.path模块(Python 3.4版本之前推荐使用该模块)

#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com from os import path p = path.join("C:\Windows","System32","drivers","etc") print(type(p),p) print(path.exists(p)) #判断路径p是否存在 print(path.split(p)) #将路径进行切分,需要注意的是,windows和Linux切分方式可能不太一样 print(path.abspath(".")) #打印当前的绝对路径 print(path.join("/",p,"hosts")) #将路径进行拼接 print(path.dirname(p)) #父目录 print(path.basename(p)) #最末层的目录 print(path.splitdrive(p)) #获取驱动器名称,该方法一般用在windows操作系统,可以一目了然的看出来某目录的驱动器名称 #以上代码输出结果如下:
<class 'str'> C:\Windows\System32\drivers\etc
True
('C:\\Windows\\System32\\drivers', 'etc')
D:\Python\project\自动化运维\yinzhengjie_devops\day007
C:\Windows\System32\drivers\etc\hosts
C:\Windows\System32\drivers
etc
('C:', '\\Windows\\System32\\drivers\\etc')
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com from os import path p1 = path.abspath(__file__) print(p1,path.basename(p1)) while p1 != path.dirname(p1):
p1 = path.dirname(p1)
print(p1,path.basename(p1)) #以上代码输出结果如下:
D:\Python\project\自动化运维\yinzhengjie_devops\day007\01.path模块.py 01.path模块.py
D:\Python\project\自动化运维\yinzhengjie_devops\day007 day007
D:\Python\project\自动化运维\yinzhengjie_devops yinzhengjie_devops
D:\Python\project\自动化运维 自动化运维
D:\Python\project project
D:\Python Python
D:\

遍历当前目录

二.pathlib模块(Python 3.4版本开始建议使用pathlib模块,提供Path对象来操作。包括目录和文件)

1>.初始化

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com """
Python3.4版本开始,建议使用pathlib模块,提供Path对象来操作,包括目录和文件
""" from pathlib import Path p1 = Path() #当前目录 p2 = Path('a','b','c\d') #当前目录下的"a\b\c\d",我是在windows下执行的代码 p3 = Path('/etc') #根下的etc目录 print("p1 = {}".format(p1))
print("p2 = {}".format(p2))
print("p3 = {}".format(p3)) #以上代码执行结果如下:
p1 = .
p2 = a\b\c\d
p3 = \etc

2>.parts和joinpath属性

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com """
Python3.4版本开始,建议使用pathlib模块,提供Path对象来操作,包括目录和文件
""" from pathlib import Path p = Path() p = p / 'a' p1 = 'b' / p p2 = Path('c') p3 = p2 / p1 print(p3.parts) #分解操作,可以返回路径中的每一个部分 p4 = p3.joinpath('etc','init.d',Path('httpd')) #连接多个字符串到Path对象中 print("p1 = {},\t p1.parts = {}".format(p1,p1.parts))
print("p2 = {},\t p2.parts = {}".format(p2,p2.parts))
print("p3 = {},\t p3.parts = {}".format(p3,p3.parts))
print("p4 = {},\t p4.parts = {}".format(p4,p4.parts)) #以上代码执行结果如下:
('c', 'b', 'a')
p1 = b\a, p1.parts = ('b', 'a')
p2 = c, p2.parts = ('c',)
p3 = c\b\a, p3.parts = ('c', 'b', 'a')
p4 = c\b\a\etc\init.d\httpd, p4.parts = ('c', 'b', 'a', 'etc', 'init.d', 'httpd')

3>.获取路径

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com """
Python3.4版本开始,建议使用pathlib模块,提供Path对象来操作,包括目录和文件
""" from pathlib import Path p1 = Path("C:\Windows\System32\drivers\etc\hosts") print(str(p1)) #获取路径字符串 print(bytes(p1)) #获取路径字符串的bytes #以上代码执行结果如下:
C:\Windows\System32\drivers\etc\hosts
b'C:\\Windows\\System32\\drivers\\etc\\hosts'

4>.父目录

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com """
Python3.4版本开始,建议使用pathlib模块,提供Path对象来操作,包括目录和文件
""" from pathlib import Path p1 = Path("C:\Windows\System32\drivers\etc\hosts") print(p1.parent.parent) #目录的逻辑父目录 for item in p1.parents: #父目录序列,索引0是直接的父目录
print(item) #以上代码执行结果如下:
C:\Windows\System32\drivers
C:\Windows\System32\drivers\etc
C:\Windows\System32\drivers
C:\Windows\System32
C:\Windows
C:\

5>.name,stem,suffix,suffixes.with_suffix(fuffix),with_name(name)

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com """
Python3.4版本开始,建议使用pathlib模块,提供Path对象来操作,包括目录和文件
""" from pathlib import Path p1 = Path("C:\Windows\System32\drivers\etc\hosts.txt") print(p1.name) #获取目录的最后一个部分
print(p1.suffix) #目录中最后一个部门的扩展名称,可以为空
print(p1.suffixes) #返回多个扩展名列表
print(p1.stem) #目录最后一个部分,没有后缀
print(p1.with_name("protocol")) #替换目录最后一个部分并返回一个新的路径 p2 = Path("C:\Windows\System32\drivers\etc\services")
print(p2.with_suffix(".txt")) #补充扩展名到路径末尾,返回新的路径,扩展名存在则无效 #以上代码执行结果如下:
hosts.txt
.txt
['.txt']
hosts
C:\Windows\System32\drivers\etc\protocol
C:\Windows\System32\drivers\etc\services.txt

6>.目录的常用方法

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com """
Python3.4版本开始,建议使用pathlib模块,提供Path对象来操作,包括目录和文件 cwd()
返回当前工作目录
home()
返回当前家目录
is_dir()
是否是目录,目录存在返回True
is_file()
是否是普通文件,文件存在返回True
is_symlink()
是否是软连接
is_socket()
是否是socket文件
is_block_device()
是否是块设备
is_char_device()
是否是字符设备
is_absolute()
是否是绝对路径
resolve()
返回一个新的路径,这个新路径就是当前Path对象的绝对路径,如果是软连接则直接被解析
absolute()
也可以获取绝对路径,但是推荐使用resolve()
exists()
目录或文件是否存在
rmdir()
删除空目录。没有提供判断目录为空的方法
touche(mode=0o666,exist_ok=True)
创建一个文件
as_uri()
将目录返回成URL,例如:"file:///etc/hosts"
mkdir(mode=0o777,partents=False,exist_ok=Flase)
parents,是否创建父目录,True等同于mkdir -p;Flase时,父目录不存在,则抛出FileNotFountError,exist_ok参数,在3.5版本加入。Flase时,路径存在,抛出FileExistsError;True时,FileExistsError被忽略。
iterdir()
迭代当前目录
""" from pathlib import Path p1 = Path() p1 /= 'a/b/c/d' p1.exists() #创建目录
# p1.mkdir() #FileNotFoundError p1.mkdir(parents=True)
p1.exists() p1.mkdir(parents=True,exist_ok=True) p1 /= "README.txt" p1.parent.rmdir() p1.parent.exists() # p1.mkdir() #FileNotFoundError p1.mkdir(parents=True) #遍历,并判断文件类型,如果是目录是否可用判断其为空
for x in p1.parents[len(p1.parents)-1].iterdir():
print(x,end='\t')
if x.is_dir():
flag = False
for _ in x.iterdir():
flag = True
break
print("dir", "Not Empty" if flag else "Empyt", sep='\t')
elif x.is_file():
print("file")
else:
print("other file")

7>.通配符

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com """
Python3.4版本开始,建议使用pathlib模块,提供Path对象来操作,包括目录和文件 glob(pattern)
通配符给定的模式
rglob(pattern)
通配符给定的模式,递归目录,返回一个生成器
""" from pathlib import Path p1 = Path("C:\Windows\System32\drivers\etc") print(list(p1.glob("host*"))) #返回当前目录对象下的以host开头的文件 print(list(p1.glob("**/*.ddl"))) #递归所有目录,等同于rglob g = p1.rglob('host*') #生成器 for _ in g:
print(next(g)) #以上代码执行结果如下:
[WindowsPath('C:/Windows/System32/drivers/etc/hosts'), WindowsPath('C:/Windows/System32/drivers/etc/hosts.dz')]
[]
C:\Windows\System32\drivers\etc\hosts.dz

8>.匹配

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com """
Python3.4版本开始,建议使用pathlib模块,提供Path对象来操作,包括目录和文件 match(pattern)
模式匹配,成功返回True
""" from pathlib import Path p1 = Path('D:\Python\project\yinzhengjie_devops\day007\01.pathlib_demo.py') print(p1.match("*.py")) print(p1.match("day007\01.pathlib_demo.py")) print(p1.match("D:\**\project\**\**\01.pathlib_demo.py")) print(p1.match("**\01.pathlib_demo.py")) print(p1.match("*\*.py")) #以上代码执行结果如下:
True
True
True
True
True

9>.stat()方法

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com """
Python3.4版本开始,建议使用pathlib模块,提供Path对象来操作,包括目录和文件
stat()
相当于stat命令
last()同stat(),但如果是符号链接,则显示符号链接本身的文本信息
""" from pathlib import Path p1 = Path("/yinzhengjie/softwares/mysql-5.7.25-linux-glibc2.12-x86_64") print(p1.stat()) p2 = Path("/yinzhengjie/softwares/mysql") print(p2.stat()) print(p2.lstat())

10>.文件操作

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com """
Python3.4版本开始,建议使用pathlib模块,提供Path对象来操作,包括目录和文件 open(self, mode='r', buffering=-1, encoding=None,errors=None, newline=None)
使用方法类似内奸函数open,返回一个文件对象。 Python3.5增加的新函数
read_bytes()
以"rb"读取路径对应文件,并返回二进制流,可通过IDE去看源码。
read_text(encoding=None,error=None)
以"rt"方式读取路径对应文件,返回文本
write_bytes(data)
以"wb"方式写入数据到路径对应文件
write_text(data,encoding=None,errors=None)
以"wt"方式写入字符串到路径对应文件。
"""
from pathlib import Path p1 = Path("my_binary_file") p1.write_bytes(b"https://www.cnblogs.com/yinzhengjie") print(p1.read_bytes()) p2 = Path("my_text_file") p2.write_text("https://www.cnblogs.com/yinzhengjie") print(p2.read_text()) with p2.open() as f:
print(f.read(5)) #以上代码执行结果如下:
b'https://www.cnblogs.com/yinzhengjie'
https://www.cnblogs.com/yinzhengjie
https

三.os模块其它常用方法

 #!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie import os,sys path = r"C:\Windows\System32\drivers\etc" print(os.name) #windows是nt,Linux是posix。 # print(os.uname()) #unix/linux系统支持 print(sys.platform) #windows显示win32,Linux显示Linux print(os.listdir(path)) #返回指定目录内容列表,不递归 p1 = path + r"\hosts"
print(os.stat(p1)) # print(os.chmod(p1,0O77)) #和Linux操作系统的chmod命令类似
# print(os.chown(p1,uid=0,gid=0)) #和Linux操作系统的chown命令类似,可以改变文件的属主,属组,但需要足够的权限 """
os模块除了上面列举的还有很多,感兴趣的小伙伴可以在这个模块里找类似需求的方法,满足我们平时的开发基本上问题不大。
对了,os模块也有open,read,write等方法,但是太底层,建议使用内建函数open,read,write,使用方法相似。
"""