云计算百科
云计算领域专业知识百科平台

Python 程序设计讲义(67):Python 的文件操作——使用os与os.path模块操作目录

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

赞(0)
未经允许不得转载:网硕互联帮助中心 » Python 程序设计讲义(67):Python 的文件操作——使用os与os.path模块操作目录
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!