Python 程序设计讲义(67):Python 的文件操作——使用os与os.path模块操作目录
目录
- Python 程序设计讲义(67):Python 的文件操作——使用os与os.path模块操作目录
-
- 一、`os`和`os.path`模块
- 二、文件的路径
-
-
- 1、相对路径
- 2、绝对路径
- 3、拼接路径
-
- 三、判断一个目录是否存在:使用`os.path.exists()`函数
- 四、创建目录:使用`os.mkdir()`与`os.makedirs()`函数
-
-
- 1、创建一级目录:使用`os.mkdir()`函数
- 2、创建多级目录:使用`os.makedirs()`函数
-
- 五、删除目录:使用`os.rmdir()`或`os.removedirs()`函数
-
-
- 1、删除一级目录:使用`rmdir()`函数
- 2、删除多级目录:使用`removedirs()`函数
- 3、删除非空目录:使用`rmtree()`函数
-
- 六、遍历目录:使用`os.walk()`函数
- 七、从一个目录中提取出文件名和扩展名:使用`os.path.splitext()`函数
- 八、从一个目录中提取出文件名:使用`os.path.basename()`函数
- 九、从一个目录中提取出路径:使用`os.path.dirname()`函数
- 十、判断一个目录是否为路径,使用`os.path.isdir()`函数
目录也称为文件夹,通过目录可以分门别类地存放文件。目录操作需要使用内置的os和os.path模块。常用的目录操作包括:判断目录是否存在、创建目录、删除目录、遍历目录等。
os模块是Python内置的与系统功能和文件系统相关的模块。该模块中的语句的执行结果通常与操作系统相关。
一、os和os.path模块
os模块及其子模块os.path用于对目录或文件进行操作。在使用os模块或os.path模块时,需要先导入。
导入os模块语法格式如下:
import os
说明:导入os模块后,可以使用其子模块os.path
导入os模块后,可以使用模块提供的通用变量获取与系统有关的信息。
例如:在IDLE中执行如下命令。
import os
os.name #返回操作系统版本:nt表示windows
'nt'
os.sep #返回当前操作使用使用的路径分隔符
'\\\\'
os.linesep #返回当前操作系统的换行符
'\\r\\n'
os模块提供的与目录相关的函数如下表所示:
getcwd() | 返回当前的工作目录 |
listdir(path) | 返回指定路径下的文件和目录信息 |
mkdir(path[,mode]) | 创建目录 |
makedirs(path1/path2/…[,mode]) | 创建多级目录 |
rmdir(path) | 删除目录 |
removedirs(path1/path2/…) | 删除多级目录 |
chdir(path) | 把path设置为当前工作目录 |
walk(top[,topdown[,onerror]]) | 遍历目录树,该方法返回一个元组,包括所有路径名,所有目录列表和文件列表三个元素 |
os.path模块提供的与目录相关的函数如下表所示:
abspath(path) | 获取文件或目录的绝对路径 |
exists(path) | 判断目录或文件是否存在,返回布尔值 |
join(path,name) | 将目录与目录或者目录与文件名连接起来 |
splitext() | 分离文件名和扩展名 |
basename(path) | 从一个目录中提取文件名 |
dirname(path) | 从一个路径中提取文件路径,不包括文件名 |
isdir(path) | 判断是否为路径 |
二、文件的路径
程序开发经常涉及到两种路径:相对路径与绝对路径。
1、相对路径
当前工作目录是指当前文件所在的目录。可以通过os模块提供的getcwd()函数获取当前工作目录。
例如:
import os
print(os.getcwd())
os.chdir(r'd:\\python示例')
print(os.getcwd())
程序的运行结果为:
C:\\Users\\wgx58\\PycharmProjects\\PythonProject1
d:\\python示例
相对路径就是依赖于当前工作目录的。
如果当前目录下有一个文件,在打开这个文件时,可以直接写上文件名,此时采用的就是相对路径。
比如当前路径为:d:\\python示例,当前路径下有一个文件为:hello.txt,则该文件的实际路径为:d:\\python示例\\hello.txt。如果当前路径下有一个子目录wgx,并且在该子目录中保存有文件hello.txt,打开这个文件时可以使用wgx\\hello.txt。那么该文件的实际路径为:d:\\python示例\\wgx\\hello.txt。
例如:
import os
os.chdir(r'd:\\python示例')
with open(r'wgx123.txt','w',encoding='utf-8') as f:
f.write("这个文件在当前目录下,文件的内容为:")
f.write("相对路径测试")
with open(r"wgx\\wgx456.txt","w",encoding='utf-8') as f:
f.write("这个文件在当前目录下的wgx目录中,文件的内容为:")
f.write("hello python")
查看以上两个文件的内容,代码如下:
import os
os.chdir(r'd:\\python示例')
with open(r'wgx123.txt','r',encoding='utf-8') as f:
print(f.read())
with open(r"wgx\\wgx456.txt","r",encoding='utf-8') as f:
print(f.read())
程序的运行结果为:
这个文件在当前目录下,文件的内容为:相对路径测试
这个文件在当前目录下的wgx目录中,文件的内容为:hello python
2、绝对路径
绝对路径是指文件的实际路径,它不依赖于当前工作目录。可以使用os.path模块提供的abspath()函数获取一个文件的绝对路径。
abspath()函数的语法格式如下:
os.path.abspath(path)
例如:
import os
os.chdir(r'd:\\python示例')
str1=os.path.abspath(r"wgx123.txt")
str2=os.path.abspath(r"wgx\\wgx456.txt")
print(str1)
print(str2)
程序的运行结果为:
d:\\python示例\\wgx123.txt
d:\\python示例\\wgx\\wgx456.txt
3、拼接路径
如果需要将两个或者多个路径拼接到一起形成一个新的路径,可以使用os.path模块提供的join()函数来实现。
join()函数的语法格式如下:
os.path.join(path1[,path2[,...]])
说明:
(1)使用join()函数拼接路径时,并不检测该路径是否存在。
(2)如果要拼接的路径中都是相对路径,那么拼接的结果将是一个相对路径。
(3)如果要拼接的路径中存在多个绝对路径,那么以从左到右为序最后出现的路径为准,并且该路径之前的参数将被忽略。
例如:
import os
os.chdir(r'd:\\python示例')
p1=os.path.join(r'd:\\wgx',r'hello.txt') #绝对路径+相对路径
p2=os.path.join(r'wgx','wgx456.txt') #相对路径+相对路径
p3=os.path.join(r'd:\\wgx',r'c:\\abc\\wgx') #两个都是绝对路径,返回最后一个绝对路径
print(os.path.abspath(p1))
print(os.path.abspath(p2))
print(os.path.abspath(p3))
程序的运行结果为:
d:\\wgx\\hello.txt
d:\\python示例\\wgx\\wgx456.txt
c:\\abc\\wgx
三、判断一个目录是否存在:使用os.path.exists()函数
有时需要判断给定的目录是否存在,可以使用os.path模块的exists()函数来实现。
exists()函数的语法格式如下:
os.path.exists(path)
说明:
(1)返回值是一个布尔值。
(2)path既可以使用绝对路径,也可以使用相对路径
例如:
import os
os.chdir(r'd:\\python示例')
print(os.path.exists(r"wgx123.txt"))
print(os.path.exists(r"d:\\python示例\\wgx\\wgx456.txt"))
print(os.path.exists(r"wgx456.txt"))
print(os.path.exists(r"c:\\wgx\\abc"))
程序的运行结果为:
True
True
False
False
四、创建目录:使用os.mkdir()与os.makedirs()函数
1、创建一级目录:使用os.mkdir()函数
使用os.mkdir()函数只能创建指定路径中的最后一级目录。如果该目录的上一级目录不存在,则抛出异常。
os.mkdir()函数的语法格式如下:
os.mkdir(path[,mode=0o777])
说明:
(1)path为要创建的目录,可以是绝对路径,也可以是相对路径。
(2)如果要创建的目录已存在,则抛出异常。
(3)mode用于指定目录的权限,默认为777,该参数在非UNIX操作系统上无效。
例如:
import os
os.chdir(r'd:\\python示例')
os.mkdir(r'dir20250809') #相对路径
os.mkdir(r'd:\\python示例\\dir123') #绝对路径
print(os.listdir(r"d:\\python示例"))
程序的运行结果为:
['college.csv', 'dir123', 'dir20250809', 'hello – 副本.txt', 'hello.txt', 'hello001.txt', 'p111.png', 'python.png', 'stu.csv', 'wgx', 'wgx.txt', 'wgx123.txt']
在创建目录之前,可以先判断要创建的目录是否存在。
例如:
import os
os.chdir(r'd:\\python示例')
if not os.path.exists('dir123'):
os.mkdir(r'd:\\python示例\\dir123')
else:
print("要创建的目录已存在")
print(os.listdir(r"d:\\python示例"))
程序的运行结果为:
要创建的目录已存在
['college.csv', 'dir123', 'dir20250809', 'hello – 副本.txt', 'hello.txt', 'hello001.txt', 'p111.png', 'python.png', 'stu.csv', 'wgx', 'wgx.txt', 'wgx123.txt']
2、创建多级目录:使用os.makedirs()函数
要创建多级目录,可以使用os.makedirs()函数,该函数采用递归的方式创建目录。
os.makedirs()函数的语法格式如下:
os.makedirs(path[,mode=0o777])
例如:
import os
os.chdir(r'd:\\python示例')
if not os.path.exists(r'dir123\\aaa\\bbb\\ccc'):
os.makedirs(r'd:\\python示例\\dir123\\aaa\\bbb\\ccc')
else:
print("要创建的目录已存在")
print(os.path.exists(r'dir123\\aaa\\bbb\\ccc'))
程序的运行结果为:
True
五、删除目录:使用os.rmdir()或os.removedirs()函数
使用rmdir()函数或removedirs()函数删除目录时,只有要删除的目录为空才可以删除。
1、删除一级目录:使用rmdir()函数
使用rmdir()函数只能删除最后一级目录。
rmdir()函数的语法格式如下:
os.rmdir(path)
说明:
(1)path为要删除的目录,可以是绝对路径,也可以是相对路径
(2)如果要删除的目录不存在,则抛出异常
当目录不为空时,抛出异常:
import os
os.chdir(r'd:\\python示例')
os.rmdir('dir123')
程序的运行结果为:
Traceback (most recent call last):
File "C:\\Users\\wgx58\\PycharmProjects\\PythonProject1\\hello.py", line 3, in <module>
os.rmdir('dir123')
~~~~~~~~^^^^^^^^^^
OSError: [WinError 145] 目录不是空的。: 'dir123'
删除空目录wgx,代码如下:
import os
os.chdir(r'd:\\python示例')
os.rmdir(r'wgx')
print(os.listdir(r'd:\\python示例'))
程序的运行结果为:
['college.csv', 'dir123', 'dir20250809', 'hello – 副本.txt', 'hello.txt', 'hello001.txt', 'p111.png', 'python.png', 'stu.csv', 'wgx.txt', 'wgx123.txt']
2、删除多级目录:使用removedirs()函数
使用removedirs()函数可以删除多级目录。如:目录dir123下面有两个目录,分别为aa和bb,使用removedirs(r'dir123\\aa)删除目录时,只能删除aa目录,再使用removedirs(r'dir123\\bb)删除目录时,则把dir123与下面的bb目录一起删除。
例如:dir123目录下有两个目录:aa和bb
查看dir123目录下的文件与目录
import os
os.chdir(r'd:\\python示例')
print(os.listdir(r'd:\\python示例\\dir123'))
程序的运行结果为:
['aa', 'bb']
删除dir123下面的aa目录:
import os
os.chdir(r'd:\\python示例')
os.removedirs(r"dir123\\aa")
print(os.listdir(r'd:\\python示例\\dir123'))
程序的运行结果为:
['bb']
继续删除dir123下面的bb目录:
import os
os.chdir(r'd:\\python示例')
os.removedirs(r"dir123\\bb") #此操作把dir123\\bb目录和dir123一并删除
print(os.listdir(r'd:\\python示例'))
程序的运行结果为:
['college.csv', 'dir20250809', 'hello – 副本.txt', 'hello.txt', 'hello001.txt', 'p111.png', 'python.png', 'stu.csv', 'wgx.txt', 'wgx123.txt']
3、删除非空目录:使用rmtree()函数
rmtree()函数位于模块shutil中。
例如:
import shutil
import os
print(os.listdir(r'd:/'))
shutil.rmtree(r'd:\\mydir') #删除非空目录
print(os.listdir(r'd:/'))
程序的运行结果为:
['$RECYCLE.BIN', '.minecraft', '0工作文档', '360Downloads', '360RecycleBin', '360安全浏览器下载', 'CloudMusic', 'DumpStack.log.tmp', 'FeverApps', 'FeverGames', 'MCLDownload', 'mydir', 'myvm', 'pagefile.sys', 'PCL', 'Program Files', 'Program Files (x86)', 'python示例', 'QQMusicCache', 'System Volume Information', 'WeGame', 'WeGameApps', '常用软件', '微信2025']
['$RECYCLE.BIN', '.minecraft', '0工作文档', '360Downloads', '360RecycleBin', '360安全浏览器下载', 'CloudMusic', 'DumpStack.log.tmp', 'FeverApps', 'FeverGames', 'MCLDownload', 'myvm', 'pagefile.sys', 'PCL', 'Program Files', 'Program Files (x86)', 'python示例', 'QQMusicCache', 'System Volume Information', 'WeGame', 'WeGameApps', '常用软件', '微信2025']
六、遍历目录:使用os.walk()函数
遍历就是把指定的目录下的全部目录(包括子目录)及文件全部浏览一遍。使用os.walk()函数可以遍历某一个目录下的所有字母及文件。
os.walk()函数的语法格式如下:
walk(top[,topdown[,onerror]])
说明:
(1)top:用于指定要遍历内容的根目录。
(2)topdown:可选参数,用于指定遍历的顺序。如果为True,表示自上而下遍历。如果为False,表示自下而上遍历。默认为True。
(3)onerror:可选参数,用于指定错误处理方式,默认为忽略。
(4)函数返回一个包含三个元素(dirpath,dirname,filename)的元组为元素的生成器对象。
dirpath表示当前遍历的路径,是一个字符串。
dirname表示当前路径下包含的目录,是一个列表。
filename表示当前路径下包含的文件,是一个列表。
例如:
import os
os.chdir(r'd:\\python示例')
print(list(os.walk(os.getcwd())))
程序的运行结果为:
[('d:\\\\python示例', ['dir20250809'], ['college.csv', 'hello – 副本.txt', 'hello.txt', 'hello001.txt', 'p111.png', 'python.png', 'stu.csv', 'wgx.txt', 'wgx123.txt']), ('d:\\\\python示例\\\\dir20250809', [], [])]
说明:当前目录下包含一个目录dir20250809和若干个文件,目录dir20250809为空目录。
再比如:
import os
os.chdir(r'd:\\python示例')
l1=list(os.walk(r'D:\\mydir'))
for item in l1:
print(item)
程序的运行结果为:
('D:\\\\mydir', ['aa', 'bb', 'cc'], []) #D:\\\\mydir目录下包含三个目录:aa,bb,cc,没有文件
('D:\\\\mydir\\\\aa', ['aaaa', 'bbbb'], [])#D:\\\\mydir\\\\aa目录下包含两个目录:aaaa,bbbb,没有文件
('D:\\\\mydir\\\\aa\\\\aaaa', [], ['abc.txt', 'wgx.txt'])#D:\\\\mydir\\\\aa\\\\aaaa目录下包含两个文件:abc.txt与wgx.txt,没有子目录
('D:\\\\mydir\\\\aa\\\\bbbb', [], ['ppp.txt', 'qqq.txt'])#D:\\\\mydir\\\\aa\\\\aaaa目录下包含两个文件:ppp.txt与qqq.txt,没有子目录
('D:\\\\mydir\\\\bb', [], []) #D:\\\\mydir\\\\bb为空目录
('D:\\\\mydir\\\\cc', [], []) #D:\\\\mydir\\\\cc为空目录
七、从一个目录中提取出文件名和扩展名:使用os.path.splitext()函数
使用os.path.splitext()函数的返回值是一个元组,包含两个元素,第一个元素为文件名,第二个元素为文件的扩展名。
os.path.splitext()函数的语法格式如下:
os.path.splitext(path)
例如:
import os
os.chdir(r'd:\\python示例')
print(os.path.splitext(r"abc"))
print(os.path.splitext(r"abc.txt"))
print(os.path.splitext(r"d:\\python示例\\abc.txt"))
程序的运行结果为:
('abc', '')
('abc', '.txt')
('d:\\\\python示例\\\\abc', '.txt')
八、从一个目录中提取出文件名:使用os.path.basename()函数
使用os.path.basename()函数可以返回一个目录中包含的文件名(包括文件名与扩展名)。返回值是一个字符串。
os.path.basename()函数的语法格式如下:
os.path.basename(path)
例如:
import os
os.chdir(r'd:\\python示例')
print(os.path.basename(r'ppp.txt'))
print(os.path.basename(r'dir123\\wgx.txt'))
print(os.path.basename(r'dir123/'))
print(os.path.basename(r'dir123'))
程序的运行结果为:
ppp.txt
wgx.txt
dir123
九、从一个目录中提取出路径:使用os.path.dirname()函数
使用os.path.dirname()函数可以返回一个目录中包含的路径名称。返回值是一个字符串。
os.path.dirname()函数的语法格式如下:
os.path.dirname(path)
例如:
import os
os.chdir(r'd:\\python示例')
print(os.path.dirname(r'ppp.txt')) #返回空字符串
print(os.path.dirname(r'd:\\python示例\\ppp.txt'))
print(os.path.dirname(r'dir123\\wgx.txt'))
print(os.path.dirname(r'd:\\python示例\\dir123/'))
print(os.path.dirname(r'dir123')) #返回空字符串
print(os.path.dirname(r'd:\\python示例\\dir123'))
程序的运行结果为:
d:\\python示例
dir123
d:\\python示例\\dir123
d:\\python示例
十、判断一个目录是否为路径,使用os.path.isdir()函数
使用os.path.isdir()函数可以判断一个目录是否为路径(不包含文件名)。返回一个布尔值。os.path.isdir()函数会检查目录在磁盘上是否存在。
如果指定的目录不是一个路径(包含文件名),返回False。如果指定的目录是一个路径,但该路径在磁盘上不存在,仍然返回False。如果指定的目录是一个路径,并且该路径真实存在,则返回True。
os.path.isdir()函数的语法格式如下:
os.path.isdir(path)
例如:
import os
os.chdir(r'd:\\python示例')
print(os.path.isdir(r'ppp.txt')) #不是路径
print(os.path.isdir(r'd:\\python示例')) #是路径并且存在
print(os.path.isdir(r'dir123\\wgx.txt')) #不是路径
print(os.path.isdir(r'd:\\python示例\\dir123/')) #是路径并且存在
print(os.path.isdir(r'dir123')) #是路径并且存在
print(os.path.isdir(r'd:\\python示例\\dir123')) #是路径并且存在
print(os.path.isdir(r'd:\\python示例\\dir456')) #是路径,但该路径在磁盘上不存在
程序的运行结果为:
False
True
False
True
True
True
False
评论前必须登录!
注册