Python的路径操作(os模块与pathlib模块)
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,使用方法相似。
"""
Python的路径操作(os模块与pathlib模块)的更多相关文章
- python路径操作新标准:pathlib 模块
之前如果要使用 python 操作文件路径,我总是会条件反射导入 os.path. 而现在,我会更加喜欢用新式的 pathlib, 虽然用得还是没有 os.path 熟练,但是以后会坚持使用. pat ...
- Python中路径操作
目录 1. os.path模块 2. pathlib模块 2.1 目录操作 2.2 文件操作 3. shutil模块 3.1 os模块 3.2 shutil模块 1. os.path模块 3.4版本之 ...
- 路径操作OS模块和Path类(全)一篇够用!
路径操作 路径操作模块 os模块 os属性 os.name # windows是nt, linux是posix os.uname() # *nix支持 sys.platform #sys模块的属性, ...
- python之文件系统操作(os模块)
文件系统操作(os模块) import os file_name = "D:\\test_data\\1.txt" file_name_2 = "D:\\test_dat ...
- day18 时间:time:,日历:calendar,可以运算的时间:datatime,系统:sys, 操作系统:os,系统路径操作:os.path,跨文件夹移动文件,递归删除的思路,递归遍历打印目标路径中所有的txt文件,项目开发周期
复习 ''' 1.跨文件夹导包 - 不用考虑包的情况下直接导入文件夹(包)下的具体模块 2.__name__: py自执行 '__main__' | py被导入执行 '模块名' 3.包:一系列模块的集 ...
- Python 搜索文件,文件过滤,pathlib模块
1,搜索文件,文件过滤 这里使用:pathlib 模块的 Path.glob(pattern) 方法,该方法可以用来过滤目标文件,以迭代器的形式返回搜索结果. pattern: 通配符:" ...
- python(3):文件操作/os库
文件基本操作 r,以读模式打开, r+=r+w, w, 写模式(清空原来的内容), w+=w+r, a , 追加模式, a+=a+r, rb, wb, ab, b表示以二进制文件打开 想在一段文 ...
- Python文件路径操作
print(os.environ.get('HOME')) # 打印`HOME`这个环境变量 /Users/<> file_path = os.environ.get('HOME') + ...
- Python进阶5---StringIO和BytesIO、路径操作、OS模块、shutil模块
StringIO StringIO操作 BytesIO BytesIO操作 file-like对象 路径操作 路径操作模块 3.4版本之前:os.path模块 3.4版本开始 建议使用pathlib模 ...
随机推荐
- notepad++之个性化配置
在Linux下,喜欢用vi做文件编辑(vim反倒没怎么用).在Windows系统下,用得最多的则是notepad++.开源大法好.. 之所以选择notepad++,是因为其不会强制你命名并保存文件,你 ...
- Activiti Service介绍
原文地址:https://www.cnblogs.com/lyh421/p/6419518.html 第一章 认识Activiti 内容概览:讲解activiti的特点.接口概览.架构等基本信息. 1 ...
- Linux文件的基本操作函数
1.Linux文件的基本操作 Linux文件的基本操作主要包括了文件的创建.打开.读写和关闭等基本操作. 1.1.文件操作系统调用 (1)创建文件系统函数 int creat(const char * ...
- Ubuntu 定时关机
sudo shutdown +120 Shutdown scheduled for Sat 2019-09-21 23:48:44 CST, use 'shutdown -c' to cancel.
- (语法基础)浅谈面向切面编程(AOP)
一:前言 面向切面编程是一个很重要的编程思想,想要写出一个便于维护的程序,理解AOP并且能熟练的在实际编程中合理的运用AOP思想是很有必要的 二:AOP的基本概念 基础概念:AOP中文翻译面向切面编程 ...
- SQL Server 类似正则表达式的字符处理问题
SQL Serve提供了简单的字符模糊匹配功能,比如:like, patindex,不过对于某些字符处理场景还显得并不足够,日常碰到的几个问题有: 1. 同一个字符/字符串,出现了多少次 2. 同一个 ...
- Java多线程编程(3)--线程安全性
一.线程安全性 一般而言,如果一个类在单线程环境下能够运作正常,并且在多线程环境下,在其使用方不必为其做任何改变的情况下也能运作正常,那么我们就称其是线程安全的.反之,如果一个类在单线程环境下运作 ...
- Word 插入页码 -- 视频教程(7)
1. 以本科做的一个课程设计为例 >> 视频教程链接:B站,速度快,清晰 未完 ...... 点击访问原文(进入后根据右侧标签,快速定位到本文)
- Python学习之路:关于列表(List)复制的那点事
要谈列表的复制,我们就要谈到Python的赋值规则 首先我们创建列表a: a = [1,2,3] 通常我们复制一个元素的方法是这样的: b = a #复制元素的一般方法 print(a) print( ...
- RabbitMq 概述
RabbitMQ是实现了高级消息队列协议(Advanced Message Queueing Protocol , AMQP)的开源消息代理软件(亦称面向消息的中间件). 1.AMQP协议 Rocke ...