os模块是python提供用于访问操作系统的标准模块,对目录和文件操作提供了非常多的方法。
本篇文章主要介绍一些关于os模块中的一些简单的对于文件和文件夹的基本操作的函数的用法,包括获取或改变当前的工作目录,遍历指定路径下的所有的文件文件夹以及子文件夹,创建与删除以及重命名文件夹等操作。
首先将os模块导入import os
如果你的操作系统是Windows(Windows的操作系统是NT内核),使用os.name
会返回’nt’,如果你的操作系统是Linux/Unix(内核是posix)会返回’posix’.
使用os.getcwd()
会返回你的当前工作目录,比如当前我使用的工作目录是F盘的test文件夹,便会返回’F:\test’。
现在我要将工作路径改变成F盘test文件夹下的A文件夹,那么我就可以使用os.chdir('F:\\test\\A')
进行改变。
此时再获取当前的工作目录的话就会返回’F:\test\A’。
chdir实际上是change directory缩写取了change的前两个字母,directory的前三个字母,这样是不是一下子就可以记住。
os.listdir()
如果不指定路径会返回当前工作目录下的文件和文件夹列表,也可指定任意路径便会返回指定路径下所有的文件和文件夹,比如我的F盘test文件夹下有一个文件夹A和一个excel与一个ppt,那么使用os.listdir('F:\\test')
则会返回[‘A’, ‘EXCEL.xlsx’, ‘PPT.pptx’]。
os.listdir()
只能返回你指定的路径下的所有文件和文件夹,如果要遍历路径下包含子目录下的所有文件和文件夹那么便要使用os.walk()
了,os.walk()
默认使用从上到下的遍历方式扫描该目录下所有的文件夹以及文件,先从当前工作目录扫描,再延伸到子文件夹下,扫描的会有三部分组成,第一部分是当前的目录是哪个,第二部分是当前目录下有哪些子目录即文件夹,第三部分是当前目录下的文件。
for curdir,dir, file in os.walk('F:\\test'):
print("=======================")
print("当前目录:" + curdir)
print("子目录:" + str(dir))
print("文件:" + str(file))
扫描F盘中的test文件夹,会返回:
我们可以看到先是扫描了test文件夹下所有的文件和文件夹,又扫描了test文件夹下A文件下所有的内容,最后扫描了A文件夹下B文件夹下所有的内容。
如果不想使用自上而下的扫描方式,想要使用自下而上的扫描方式,那么可以使用参数topdown=False
来解决。同样扫描F盘中的test文件夹:
for curdir, dir, file in os.walk('F:\\test',topdown=False):
print("====================")
print("当前目录:" + curdir)
print("子目录:" + str(dir))
print("文件:" + str(file))
会返回:
可以看到它先扫描了最里层的B文件夹,最后才扫描了test文件夹。
os.mkdir()
可以创建单个的文件夹,现在在test文件夹下创建一个名为new的文件夹:
print(os.listdir('F:\\test'))
os.mkdir("F:\\test\\new")
print(os.listdir('F:\\test'))
会得到:
我们可以发现test文件夹下多了一个new文件夹。但是如果创建一个已经存在的文件夹的话,会报错,比如我们使用以上代码再运行一遍会得到:
os.makedirs
给定一个路径,如果路径中有哪一层不存在的话,就自动创建直到最后。现在在test文件夹下创建一个new2的文件夹,new2文件夹中创建一个new3的文件夹:
print(os.listdir('F:\\test'))
os.makedirs('F:\\test\\new2\\new3')
print('============创建后====================')
print(os.listdir('F:\\test'))
print(os.listdir('F:\\test\\new2'))
会得到:
我们可以发现创建了一个new2的文件夹,并且在new2中创建了一个new3的文件夹。和创建单个文件夹的os.mkdir()
不一样的是,os.makedirs
中有一个参数exist_ok
,默认情况下exist_ok=False
如果路径存在会报错,但是如果设置成exist_ok=True
,那么即使路径已经存在也不会报错。
os.rmdir()
可以删除单个的文件夹,需要注意的是,该命令只能删除空文件夹,一旦文件夹下有文件便会报错。比如我们将刚才创建的new文件夹删除,os.rmdir('F:\\test\\new')
因为new是一个空文件夹,所有可以成功删除,但是如果我们删除test文件夹(非空)便会报错:
os.removedirs()
可以递归的删除非空的文件夹,它会从子目录开始删除,一旦子目录是空的能够成功删除,则会依次尝试删除路径中中的每个父目录,直到所有的空文件夹都被删除。一旦子目录不能成功删除也同样会报错。比如我们将刚才创建的new2以及new2中的new3删除:
print(os.listdir(('F:\\test')))
os.removedirs('F:\\test\\new2\\new3')
print('============删除后====================')
print(os.listdir(('F:\\test')))
会得到:
因为子目录new3文件夹是空的,所以可以成功删除,删除new3后new2也变成空的文件夹,因此new2也别删除掉。
os.remove()
可以删除文件,比如:
print(os.listdir(('F:\\test')))
os.remove('F:\\test\\PPT.pptx')
print(os.listdir(('F:\\test')))
会得到:
可以发现PPT已经被成功删除。
但是如果删除一个正在使用的文件会报错:
os模块中还有一个os.unlink()函数,它的功能和os.remove()函数是一样的功能。
os.rename()
可以将文件重命名,比如:
print(os.listdir())
os.rename('TXT.txt','TXT3.txt')
print('============重命名后=============')
print(os.listdir())
os.curdir
代表的是当前目录, 相当于.的作用,os.pardir
代表上一级目录,相当于 …的作用。