一、前言

  目录也称文件夹,用于分层保存文件。通过目录可以分门别类地存放文件。我们也可以通过目录快速找到想要的文件。在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目录

  运行上面代码,将删除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  # 导入os模块

tuples = os.walk("D:\\Python\\Code")  # 遍历D:\Python\Code\01
for tuple1 in tuples:  # 通过循环遍历出结果
    print(tuple1, "\n")  # 输出每一级目录元组

  如果,在“D:\Python\Code”目录下包含如图所示的内容:
在这里插入图片描述
  执行上面代码,将显示如下图所示的结果:
在这里插入图片描述


Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐