一、前言
??目录也称文件夹,用于分层保存文件。通过目录可以分门别类地存放文件。我们也可以通过目录快速找到想要的文件。在Python 中,并没有提供直接操作目录的函数或者对象而是需要使用内置的os和os.path模块实现。
说明: os模块是Python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同大的操作系统上运行,可能会得到不一样的结果。
??常用的目录操作主要有判断目录是否存在、创建目录、删除目录和遍历目录等。
说明: 本文的内容都是以Windows操作系统为例进行介绍的,所以代码的执行结果也都是在Windows操作系统下显示的。
二、os和os.path模块
??在Python 中,内置了os模块及其子模块os.path,用于对目录或文件进行操作。在使用os模块或者os.path模块时,需要先应用import语句将其导入,然后才可以应用它们提供的函数或者变量。
??导入os模块可以使用下面的代码:
import os
说明: 导入os模块后,也可以使用子模块os.path。
??导入os模块后,可以使用该模块提供的通用变量获取与系统有关的信息。常用的变量有以下几个:
??例如,获取但前系统类型,可以输入下代码:
import os
system_type = os.name
print(system_type)
??运行上面代码,将显示如图所示结果:
说明: 如果os.name的输出结果为nt,则表示是Windows操作系统;如果是posix,则表示是Linux、Unix 或 Mac OS 操作系统。
- sep:用于获取当前操作系统所使用的路径分隔符。
??例如,在Windows操作系统下输入os.sep,将显示如图所示的结果:
??例如,在Windows操作系统下输入os.linesep,将显示如图所示的结果:
??os模块还提供了一些操作目录的函数,如下表所示:
函数 | 说明 |
---|
getcwd() | 返回当前的工作目录 | listdir(path) | 返回指定路径下的文件和目录信息 | mkdir(path[,mode]) | 创建目录 | mkdir(path1/path2……[,mode]) | 创建多级目录 | rmdir(path) | 删除目录 | removedirs((path1/path2……) | 删除多级目录 | chdir(path) | 把path设置为当前工作目录 | walk(top[,topdown[,onerror]]) | 遍历目录树,该方法返回一个元组,包含所有路径名,所有目录列表和文件列表3个元素 |
??os.path模块还提供了一些操作目录的函数,如下表所示:
函数 | 说明 |
---|
abspath(path) | 用于获取文件或目录的绝对路径 | exists(path) | 用于判断目录或文件是否存在,如果存在则返回True;否则返回False | join(path,name) | 将目录与目录或者文件名拼接起来 | splitext() | 分离文件名和扩展名 | basename(path) | 从一个目录中提取文件名 | dirname(path) | 从一个路径中提取文件路径,不包括文件名 | isdir(path) | 用于判断是否为路径 |
三、路径
??用于定位一个文件或者目录的字符串称为一个路径。在程序开发时,通常涉及两种路径,一种是相对路径,另一种是绝对路径。
1.相对路径
??在学习相对路径之前,需要先了解什么是当前工作目录。当前工作目录是指当前文件所在的目录。在Python中,可以通过os模块提供的getcwd()函数获取当前工作目录。例如,在"D:\Python\test.py"文件中,编写一下代码:
import os
print(os.getcwd())
??执行上面的代码后,将显示以下目录,该目录就是当前工作目录:
D:\Python
??相对路径就是依赖于当前工作目录的。如果在当前工作目录下,有一个名称为message.txt的文件,那么在打开这个文件时,就可以直接写上文件名,这时采用的就是相对路径,message.txt文件的实际路径就是当前工作目录"D:\Python"+相对路径"message.txt",即"D:\Python\test.py"
??如果在当前工作目录下,有一个子目录demo,并且在该子目录下保存着文件message.txt,那么在打开这个文件时就可以写上“demo/message.txt”,例如下面代码:
with open("demo/message.txt") as file
pass
说明: 在Python中,指定文件路径时需要对路径分隔符“\”进行转义,即将路径中的“\”替换为“\”,例如对于相对路径为"demo\message.txt"需要使用"demo\message.txt"代替。另外,也可以将路径分隔符“\”采用“/”代替。
多学两招: 在指定文件路径时,也可以在表示路径字符串前面加上字母r(或R),那么该字符串将原样输出,这时路径中的分隔符就不需要再转义了,例如,上面代码可以修改以下内容:
with open(r"demo\message.txt") as file
pass
2.绝对路径
??绝对路径是指在使用文件时指定文件的实际路径,它不依赖于当前工作目录。在Python中,可以通过os.path模块提供的abspath()函数获取一个文件的绝对路径。abspath()函数的基本语法格式如下:
os.path.abspath(path)
??例如,要获取相对路径"demo\message.txt"的绝对路径,可以使用下面代码:
import os
print(os.path.abspath(r"demo\message.txt"))
??如果当前工作目录为"D:\Python",那么将得到以下结果:
D:\Python\demo\message.txt
3.拼接路径
??如果想要将两个或者多个路径拼接到一起组成一个新的路径,可以使用os.path模块提供的join()函数实现。join()函数基本语法格式如下:
os.path.join(path1[,path2[,……]])
??其中,path1、path2用于代表要拼接的文件路径,这些路径间使用逗号进行分隔。如果在要拼接的路径中,没有一个绝对路径,那最后拼接出来的将是一个绝对路径。
注意: 使用os.path.join()函数拼接路径时,并不会检查该路径是否存在。
??例如,需要将"D:\Python"和"demo\message.txt"路径拼接到一起,可以使用下面代码:
import os
print(os.path.join("D:\Python","demo\message.txt")
??执行上面代码,将得到以下结果:
D:\Python\demo\message.txt
说明: 在使用join()函数时,如果要将拼接的路径中,存在多个绝对路径,那么以从左到右的顺序最后一次出现的为准,并且该路径之前的参数都将被忽略,例如下面的代码:
import os
print(os.path.join("E:\\code","D:\\Python","Code","C:\\","demo"))
??将得到拼接后的路径为"C:\demo"。
??把两个路径拼接为一个路径时,不要直接使用字符串拼接,而是使用os.path.join()函数,这样可以正确处理不同操作系统的路径分隔符。
四、判断目录是否存在
??在Python中,有时需要判断给定的目录是否存在,这时可以使用os.path模块提供的exists()函数实现。exists()函数的基本语法格式如下:
os.path.exists(path)
??其中,path为要判断的目录,可是采用绝对路径,也可以采用相对路径。 ??返回值:如果给定的路径存在,则返回True,否则,返回False。
??例如,要判断绝对路径"C:\demo"是否存在,可以使用下面代码:
import os
print(os.path.exists("C:\\demo"))
??执行上面代码,如果在C盘根目录下没有demo子目录,则返回False,否则返回True。
说明: os.path.exists()函数除了可以判断目录是否存在,还可以判断文件是否存在。例如,将上面的"C:\demo"替换为"C:\demo\test.txt",则用于判断C:\demo\test.txt文件是否存在。
五、创建目录
??在Python中,os模块提供了两个创建目录的函数,一个用于创建一级目录,另一个用于创建多级目录。
1.创建一级目录
??创建一级目录是指一次只能创建一级目录。在Python中,可以使用os模块提供的mkdir()函数实现。通过该函数只能创建指定路径中的最后一级目录,如果该目录的上一级不存在,则抛出FileNotFoundError异常。mkdir()函数的基本语法格式如下:
os.mkdir(path , mode=0777)
参数说明:
- path:用于指定要创建的目录,可以使用绝对路径,也可以使用相对路径。
- mode:用于指定指定数值模式,默认值为0777。该参数在UNIX系统上无效或被忽略。
??例如,在Windows系统上创建一个C:\demo目录,可以使用下面代码;
import os
os.mkdir("C:\\demo")
??执行上面代码,将在C盘根目录下创建一个demo目录,如下图所示: ??如果在创建路径时,demo目录已经存在了,将抛出FileNotFoundError异常,如下图所示: ??要解决上面的问题,可以在创建目录前,先判断指定的目录是否存在,只有当目录不存在时才创建,具体代码如下:
import os
path = "C:\\demo"
if not os.path.exists(path):
os.mkdir(path)
print("目录创建成功")
else:
print("该目录已经存在")
注意: 如果指定的目录有多级,而且最后一级的上一级目录中不存在的,则抛出FileNotFoundError异常,并且创建不成功,这时可以使用创建多级目录的方法。
2.创建多级目录
??使用mkdir()函数只能创建一级目录,如果想创建多级,可以使用os模块提供的makedirs()函数,该函数用于采用递归的方式创建目录。makedirs()函数基本语法如下:
os.makedirs(path , mode=0777)
参数说明:
- path:用于指定要创建的目录,可以使用绝对路径,也可以使用相对路径。
- mode:用于指定指定数值模式,默认值为0777。该参数在UNIX系统上无效或被忽略。
??在Windows系统中,刚刚我们在C盘根目录下创建一个demo目录,再创建子目录test\dir\mr,可以使用下面代码:
import os
os.makedirs("C:\\demo\\test\\dir\\mr")
??执行上面代码,将创建如下图所示目录:
六、删除目录
??删除目录可以使用os模块提供的rmdir()函数实现。通过rmdir()函数删除目录时,只有当要删除的目录为空时才起作用。rmdir()函数的基本语法格式如下:
os.rmdir(path)
??其中,path为要删除的目录,可以使用相对路径,也可以使用绝对路径。
??例如,要删除刚刚创建的C:\demo\test\dir\mr目录,可以使用下面代码:
import os
os.rmdir("C:\\demo\\test\\dir\\mr")
??运行上面代码,将删除C:\demo\test\dir目录下的mr目录。
注意: 如果要删除的目录不存在,那么将抛出“FileNotFoundError:[WinError 2]系统找不到指定的文件。”异常。因此,在执行os.rmdir()函数前,建议先判断路径是否存在,可以使用os.path.exists()函数判断,具体代码如下:
import os
path = "C:\\demo\\test\\dir\\mr"
if not os.path.exists(path):
os.rmdir(path)
print("删除成功")
else:
print("该目录不存在")
多学两招: 使用rmdir()函数只能删除空的目录,如果想要删除非空的目录,则需要使用Python的内置的标准模块shutil的rmtree()函数实现。例如,删除不空的“C:\demo\test”目录,可以使用下面代码:
import shutil
shutil.rmtree("C:\\demo\\test") # 删除C:\demo目录下的test子目录及内容
七、遍历目录
??遍历在古汉语的意思是全部走遍,到处周游。在Python中,遍历的意思与其相似,就是对指定目录下的全部目录(包括子目录)以及文件浏览一遍。在Python中,os模块的walk()函数用于实现遍历目录的功能。walk()函数的语法格式如下:
os.walk(top[,topdown][,onerror][,followlinks])
参数说明:
- top:用于指定要遍历的内容的根目录。
- topdown:可选参数,用于指定遍历顺序,如果值为True,表示自上而下遍历(即先遍历根目录);如果值为False,表示自下而上遍历(最后一级子目录)。默认为True。
- onerror:可选参数,用于指定错误处理方式,默认为忽略,如果不想忽略也可以指定一个错误处理函数。通常情况下采用默认。
- followlinks:可选参数,默认情况,walk()函数不会向下转换成解析到目录的符号链接,将该参数值设置为True,表示用于指定在支持的系统上访问由符号链接指向目录。
- 返回值:返回一个包含3个元素(dirpath,dirnames,filename)的元组生成器对象。其中dirpath表示当前遍历的路径,是个字符串;dirnames表示当前路径下包含的子目录,是一个列表;filename表示当前路径下包含的文件,也是一个列表。
??例如,要遍历指定目录“D:\Python\Code”,可以使用下面代码:
import os
tuples = os.walk("D:\\Python\\Code")
for tuple1 in tuples:
print(tuple1, "\n")
??如果,在“D:\Python\Code”目录下包含如图所示的内容: ??执行上面代码,将显示如下图所示的结果:
|