基于Python的文件、目录和路径操作。我们一般使用os.path模块。pathlib是它的替代品。它在os.path的基础上进行了封装,实现了路径的对象化。api更通俗,操作更方便,更符合编程的思维习惯。pathlib模块提供了用于语义表示文件系统路径的类,适用于各种操作系统。路径类分为纯路径(提供纯计算操作,不带I/O)和具体路径(继承自纯路径,但提供I/O操作)。首先我们来看一下pathlib模块的组织结构。它的核心是6个类。这6个类的基类是PurePath类,另外5个类派生自它:箭头连接两个Class,以PurePosixPath和PurePath类为例,PurePosixPath继承自PurePath,即前者是后者。PurePath类:把一个路径当作一个普通的字符串,可以将多个指定的字符串拼接成适合当前操作系统的路径格式,也可以判断任意两条路径是否相等。从英文名称来看,Pure是纯粹的意思,意思是PurePath类只关心路径的操作,而不管路径是否有效,文件是否存在,目录是否存在于真实的文件系统中。PurePosixPath和PureWindowsPath是PurePath的子类,前者用于操作UNIX(包括MacOSX)风格操作系统的路径,后者用于操作Windows操作系统的路径。我们都知道这两种操作系统在路径分隔符上有一定的差异。Path类不同于上面三个类。在操作路径的同时,它还可以操作文件/目录,与真实的文件系统进行交互,比如判断路径是否真实存在等。PosixPath和WindowsPath是Path的子类,分别用于操作Unix(MacOSX)风格的路径和Windows风格的路径。PurePath、PurePosixPath和PureWindowsPath这三个纯路径类通常用于一些特殊情况,比如:如果需要在Unix设备上操作Windows路径,或者在Windiws设备上操作Unix路径。因为我们无法在Unix上实例化一个真正的Windows路径,但是我们可以实例化一个纯Windows路径,假装我们在操作windows。您希望确保您的代码仅操作路径,而不实际与操作系统交互。科普一下:UNIX类操作系统和Windows操作系统的路径格式是完全不同的。主要区别在于根路径和路径分隔符。UNIX系统的根路径是斜杠(/),而Windows系统的根路径是盘符(C:);UNIX系统路径使用正斜杠(/)作为分隔符,而Windows使用反斜杠()。1、PurePath类PurePath类(以及PurePosixPath类和PureWindowsPath类)提供了大量的构造方法、实例方法、类实例属性供我们使用。操作系统在实例化PurePath类时会自动适配。在UNIX或MacOSX系统上,构造函数实际上返回一个PurePosixPath对象;相反,如果在Windows系统上使用PurePath创建实例,则构造函数返回一个PureWindowsPath对象。例如在Windows系统中执行如下语句:frompathlibimportPurePathpath=PurePath('file.txt')print(type(path))#PurePath也支持传入多个路径字符串,它们将被连接成一条路径。例如:frompathlibimportPurePathpath=PurePath('https:','www.liujiangblog.com','django')print(path)#https:\www.liujiangblog.com\django可以看到,因为操作环境是以Windows为系统,所以输出的是Windows平台格式的路径。如果要在Windows上创建UNIX风格的路径,则需要指定PurePosixPath类,反之亦然。例如:frompathlibimportPurePosixPathpath=PurePosixPath('https:','www.liujiangblog.com','django')print(path)#https:/www.liujiangblog.com/django强调:做纯路径操作时,实际上,所有的字符串都被播放了,与本地文件系统没有实际关系,不进行任何磁盘IO操作。PurePath构建的路径本质上是一个字符串,可以使用str()将其转换为字符串。另外,如果在使用PurePath类的构造函数时不传入任何字符串参数,则相当于传入了点。(当前路径)作为参数:frompathlibimportPurePathpath1=PurePath()path2=PurePath('.')print(path1==path2)#True如果传入的多个参数中包含多个根路径,则PurePath构造方法,只有最后的根路径和后面的子路径才会生效。例如:frompathlibimportPurePathpath=PurePath('C:/','D:/','file.txt')print(path)#D:\file.txt额外提示,在Python中构造字符串时,Be一定要注意正/反斜杠转义时和不转义时的区别。以及使用和不使用r本机字符串。不要犯错。如果传递给PurePath构造函数的参数包含额外的斜杠或.,将被直接忽略,但..不会被忽略:frompathlibimportPurePathpath=PurePath('C:/./..file.txt')print(path)#C:\..file.txtPurePath实例支持比较运算符。对于相同样式的路径,可以判断是否相等或者比较大小(其实可以比较字符串的大小);对于不同风格的路径,只有是否相等(显然不可能相等),而不是大小:frompathlibimport*#Unix-stylepathsarecase-sensitiveprint(PurePosixPath('/D/file.txt')==PurePosixPath('/d/file.txt'))#Windows风格的路径不区分大小写print(PureWindowsPath('D://file.txt')==PureWindowsPath('d://file.txt'))#False#TruePurePath实例的常用方法和属性如下:实例属性和方法功能说明PurePath.parts返回路径字符串中包含的各个部分。PurePath.drive返回路径字符串中的驱动器号。PurePath.root返回路径字符串中的根路径。PurePath.anchor在路径字符串中返回驱动器号和根路径。PurePath.parents返回当前路径的所有父路径。PurPath.parent返回当前路径的父路径,相当于parents[0]的返回值。PurePath.name返回当前路径中的文件名。PurePath.suffixes返回当前路径中所有文件的后缀。PurePath.suffix返回当前路径中的文件后缀。即,后缀属性列表的最后一个元素。PurePath.stem返回当前路径中的主文件名。PurePath.as_posix()将当前路径转换为??UNIX风格的路径。PurePath.as_uri()将当前路径转换为??URL。只能转换绝对路径,否则将引发ValueError。PurePath.is_absolute()判断当前路径是否为绝对路径。PurePath.joinpath(*other)将多个路径连接在一起,类似于前面介绍的斜杠(/)连接器。PurePath.match(pattern)判断当前路径是否匹配指定的通配符。PurePath.relative_to(*other)从当前路径中去掉引用路径后得到结果。PurePath.with_name(name)将当前路径中的文件名替换为新文件名。如果当前路径中不存在文件名,则引发ValueError。PurePath.with_suffix(suffix)将当前路径中的文件后缀替换为新的后缀。如果当前路径中没有后缀,则添加一个新的后缀。第二,Path类更多的时候,我们直接使用Path类而不是PurePath。Path是PurePath的子类。除了支持PurePath提供的各种构造函数、属性和方法外,还提供了判断路径合法性的方法,甚至可以判断路径对应的是文件还是文件夹。如果是文件,也支持读写文件等操作。Path有2个子类,分别是PosixPath和WindowsPath。这两个子类的作用很明显,这里不再赘述。基本上使用frompathlibimportPath#创建实例p=Path('a','b','c/d')p=Path('/etc')----------------------------------------------------p=Path()#WindowsPath('.')p.resolve()#解析路径,不一定是真实路径#WindowsPath('C:/Users/liujiangblog')--------------------------------------------------#返回当前任意时刻真实的绝对路径p.cwd()#WindowsPath('D:/work/2020/django3')Path.cwd()#WindowsPath('D:/work/2020/django3')p.home()#WindowsPath('C:/Users/liujiangblog')Path.home()#WindowsPath('C:/Users/liujiangblog')目录操作p=Path(r'd:\test\11\22')p.mkdir(exist_ok=True)#创建文件目录(如果tt目录存在,否则会报错)#一般我会用下面的创建方式p.mkdir(exist_ok=True,parents=True)#递归创建文件目录p.rmdir()#删除当前目录,但是目录必须为空p#WindowsPath('d:/test/11/22')p仍然存在遍历directoriesp=Path(r'd:\test')#WindowsPath('d:/test')p.iterdir()#相当于os.listdirp。glob('*')#相当于os.listdir,但是可以添加匹配条件p.rglob('*')#相当于os.walk,也可以添加匹配条件创建创建文件file=Path(r'd:\test\11\22\test.py')file.touch()#touch方法用于创建空文件,目录必须存在,否则无法创建#回溯(最近调用last):#File"",line1,in#.....#FileNotFoundError:[Errno2]Nosuchfileordirectory:'d:\\test\\11\\22\\test.py'p=Path(r'd:\test\11\22')p.mkdir(exist_ok=True,parents=True)file.touch()file.exists()#Truefile.rename('33.py')#文件重命名或移动#Traceback(最近调用最后):#File"",line1,in#file.rename('33.py')#文件“C:\ProgramFiles\Python38\lib\pathlib.py”,第1353行,重命名#self._accessor.rename(self,target)#PermissionError:[WinError5]拒绝访问:'d:\\test\\11\\22\\test.py'->'33.py'file.rename(r'd:\test\11\22\33.py')#WindowsPath('d:/test/11/22/33.py')文件操作p=Path(r'd:\test\tt.txt.bk')p.name#获取文件名#tt.txt.bkp.stem#获取文件名中除后缀的部分#tt.txtp.suffix#文件后缀#.bkp.suffixs#文件后缀...#['.txt','.bk']p.parent#相当于dirnanme#WindowsPath('d:/test')p.parents#返回一个包含所有父目录的迭代器#foriinp.parents:print(i)#d:\test#d:\p.parts#将路径按分隔符拆分成一个元组#('d:\\','test','tt.txt.bk')p=Path('C:/Users/Administrator/Desktop/')p.parent#WindowsPath('C:/Users/Administrator')p.parent.parent#WindowsPath('C:/Users')#索引0为直接父目录,索引越大越接近根目录forxinp.parents:print(x)#C:\Users\Administrator#C:\Users#C:\#更多技术文章请访问官网https://www.liujiangblog.com#with_name(name)替换路径的最后一部分,返回一个新的路径Path("/home/liujiangblog/test.py").with_name('python.txt')#WindowsPath('/home/liujiangblog/python.txt')#with_suffix(suffix)替换扩展名并返回新路径,如果扩展名存在Path("/home/liujiangblog/test.py").with_suffix('.txt')#WindowsPath('/home/liujiangblog/test.txt')文件信息p=Path(r'd:\test\tt.txt')p.stat()#获取详细信息#os.stat_result(st_mode=33206,st_ino=562949953579011,st_dev=3870140380,st_nlink=1,st_uid=0,st_gid=0,st_size=0,st_atime=1525254557,st_mtime=15524525st_mtime55)p.75stat().st_size#文件大小#0p.stat().st_ctime#创建时间#1525254557.2090347#其他信息也可以同理获取p.stat().st_mtime#文件读写修改时间open(mode='r',bufferiong=-1,encoding=None,errors=None,newline=None)类似于Python内置的open函数,返回一个文件对象p=Path('C:/Users/Administrator/Desktop/text.txt')withp.open(encoding='utf-8')asf:print(f.readline())read_bytes():startwith'rb'以模式读取文件并返回字节类型数据write_bytes(data):以'wb'模式向文件写入数据p=Path('C:/Users/Administrator/Desktop/text.txt')p.write_bytes(b'Binaryfilecontents')#20p.read_bytes()#b'Binaryfilecontents'read_text(encoding=None,errors=None):以'r'方式读取路径对应的文件,返回textwrite_text(data,encoding=None,errors=None):向'w'模式下路径对应的文件写入一个字符串p=Path('C:/Users/Administrator/Desktop/text.txt')p.write_text('文本文件内容')#18p.read_text()#'文本文件内容'判断运算返回布尔值is_dir():是否为目录is_file():是否为普通文件is_symlink():是否是软链接is_socket():是否是socket文件is_block_device():是否是块设备is_char_device():是否为字符设备is_absolute():是否为绝对路径p=Path(r'd:\test')p=Path(p,'test.txt')#字符串拼接p。exists()#判断文件是否存在p.is_file()#判断是否为文件p.is_dir()#判断是否为目录路径拼接分解在pathlib中,通过拼接算子拼接路径主要有3种方式/:路径对象/PathobjectPathObject/stringstring/Path对象分解路径主要通过parts方法p=Path()p#WindowsPath('.')p=p/'a'p#WindowsPath('a')p='b'/pp#WindowsPath('b/a')p2=Path('c')p=p2/pp#WindowsPath('c/b/a')p.parts#('c','b','a')p.joinpath("c:","liujiangblog.com","jack")#拼接时忽略前面部分#WindowsPath('c:liujiangblog.com/jack')#更多技术文章请访问官方网站https://www.liujiangblog.comWildcardglob(pattern):wildcardgivenpatternrglob(pattern):wildcardgivenpattern,并递归搜索目录返回值:ageneratorp=Path(r'd:\vue_learn')p.glob('*.html')#匹配所有HTML文件并返回一个生成器generator#list(p.glob('*.html'))#[WindowsPath('d:/vue_learn/base.html'),WindowsPath('d:/vue_learn/components.html'),WindowsPath('d:/vue_learn/demo.html').................g=p.rglob('*.html')#递归匹配next(g)#WindowsPath('d:/vue_learn/base.html')next(g)#WindowsPath('d:/vue_learn/components.html')正则匹配使用match方法进行模式匹配,返回Truep=Path('C:/Users/Administrator/Desktop/text.txt')p如果成功.match('*.txt')#TruePath('C:/Users/Administrator/Desktop/text.txt').match('**/*.txt')#True更多内容请访问:https://www.liujiangblog.com更多视频教程请访问:https:///www.liujiangblog.com/video/