一、os.path模块介绍

os 模块是 Python 内置的与操作系统功能和文件系统相关的模块。该模块的子模块 os.path 是专门用于进行路径操作的模块。 常用的路径操作主要有判断目录是否存在、创建目录、删除目录和遍历目录等。

说明:在使用 os.path 模块时,推荐使用字符串 (Unicode) 表示文件名或者路径。由于某些 Unix 操作系统不支持 Unicode 字符串,所以需要使用字节对象;而在 Windows 操作系统中,则推荐所有的应用程序都使用字符串对象来访问文件。

os 模块和它的子模块 os.path 都属于内置模块,不需要安装,直接导入即可使用。在 Python 程序中,使用 import 语句导入 os 模块后,既可以使用 os 模块提供的属性和方法,又可以使用 os.path 模块提供的属性和方法。导入os 模块的代码如下:

import os  # 说明:导入 os 模块后,也可以使用其子模块 os.path。

如果在程序中,只涉及到 os.path 模块的内容,也可以直接导入 os.path,代码如下:

import os.path

使用上面的代码导入 os.path 模块后,就可以使用该模块提供的属性和方法了。如果不确定该模块都提供了哪些属性和方法,可以使用 Python 的内置函数 dir() 获取其全部方法列表,代码如下:

import os.path  # 操作路径的模块

print(dir(os.path))

程序运行结果如下:
在这里插入图片描述

二、常用方法

2.1 exists()方法——判断路径是否存在(准确)

exists() 方法用于判断路径(文件或目录)是否存在,如果存在则返回 True ;不存在则返回 False。如果是断开的符号链接,也返回 False。语法格式如下:

os.path.exists(path)

参数说明:

  1. path:表示要判断的路径,可以采用绝对路径,也可以采用相对路径。
  2. 返回值:如果给定的路径存在,则返回 True,否则返回 False。

注意:在使用 exists() 方法时,如果某些平台未授予 os.stat() 对所请求文件有执行的权限,即使路径真实存在,使用该方法也会返回 False。

使用 exists() 方法判断保存在 E:\Code\lesson 目录下的 main.py 文件是否存在,代码如下:

import os.path  # 操作路径的模块

path = r"E:\Code\lesson\main.py"  # 文件

if os.path.exists(path):  # 判断文件是否存在
    # E:\Code\lesson\main.py 文件存在
    print(path, "文件存在")
else:
    print(path, "文件不存在")

用 exists() 方法判断 E:\Code\lesson1 目录是否存在,代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2022-07-04 0:15
# @Author  : AmoXiang
# @File    : demo4_os_path.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680


import os.path  # 操作路径的模块

path = r"E:\Code\lesson1"  # 目录

print(os.path.exists(path))  # False
if os.path.exists(path):  # 判断目录是否存在
    print(path, "目录存在")
else:
    # E:\Code\lesson1 目录不存在
    print(path, "目录不存在")

2.2 isdir()方法——判断是否为目录

isdir() 方法用于判断指定的路径是否为目录。语法格式如下:

os.path.isdir(path)

参数说明:

  1. path:表示要判断的路径,可以采用绝对路径,也可以采用相对路径。
  2. 返回值:如果给定的路径是目录,则返回 True,否则返回 False。

向 isdir() 方法中传入绝对路径,判断该路径是否为目录,代码如下:

import os.path  # 导入os.path模块

print(os.path.isdir(r'E:/Code/lesson/main.py'))  # 判断是否为目录 False
print(os.path.isdir(r'E:/Code/lesson/'))  # 判断是否为目录 True

获取指定目录下的全部子目录,首先应用 os.listdir() 方法获取指定路径下的目录和文件列表,然后遍历该列表,并且将各路径进行连接;再判断是否为目录,如果为目录,则添加到指定列表;最后打印该列表,代码如下:

import os  # 文件与操作系统相关模块

root = r'E:/Code/lesson'
path = os.listdir(root)  # 获取指定路径下的目录和文件列表
list_dir = []  # 路径列表
for item in path:  # 遍历获取到的目录和文件列表
    p = os.path.join(root, item)  # 连接目录
    if os.path.isdir(p):  # 判断是否为目录
        list_dir.append(p)

print(f'目录:{list_dir}')  # 打印目录列表

程序运行结果如下:

目录:['E:/Code/lesson\\.idea', 'E:/Code/lesson\\python-package']

2.3 isabs()方法——判断是否为绝对路径

isabs() 方法用于判断路径是否为绝对路径。语法格式如下:

os.path.isabs(path)

参数说明:

  1. path:表示要判断的路径,可以采用绝对路径,也可以采用相对路径。
  2. 返回值:如果给定的路径是绝对路径,则返回 True,否则返回 False。

说明:在 Unix 系统中,将以斜杠开头的路径视为绝对路径;而在 Windows 系统中,以去除驱动器号后的(反向) 斜线开头的视为绝对路径。

使用 isabs() 方法分别判断两个文件的路径是否为绝对路径,如果不是绝对路径,则转换为绝对路径并输出,代码如下:

import os.path  # 操作路径的模块

path_list = [r'python-package/task1.py', r'E:\Code\lesson\python-package\demo',
             r'E:\Code\lesson\main.py']

for path in path_list:  # 遍历目录列表
    if not os.path.isabs(path):  # 如果不是绝对路径
        path = os.path.abspath(path)  # 转换为绝对路径
        print(path)  # 打印各个路径

2.4 isf ile()方法——判断是否为普通文件

isfile() 方法用于判断是否为普通文件。语法格式如下:

os.path.isfile(path)

参数说明:

  1. path:表示要判断的路径,可以采用绝对路径,也可以采用相对路径。
  2. 返回值:如果给定的路径对应的文件是普通文件,则返回 True,否则返回 False。

示例代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2022-07-04 0:15
# @Author  : AmoXiang
# @File    : demo4_os_path.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680


import os.path  # 导入os.path模块

print(os.path.isfile(r'E:\Code\lesson\main.py'))  # 判断是否为普通文件 True
# 说明:如果指定的文件不存在,则返回False。
print(os.path.isfile(r'E:\Code\lesson\main2.py'))  # False
path = r'E:\Code\lesson'  # 目录
filename = 'main.py'  # 文件名

# 连接目录和文件名时,不推荐使用字符串拼接方法实现,
# 推荐使用 os.path.join()方法实现,具体用法文本后续小节会详细讲解
print(os.path.isfile(os.path.join(path, filename)))  # 判断是否为普通文件 True

2.5 join()方法——拼接路径

join() 方法用于将两个或者多个路径拼接到一起组成一个新的路径。语法格式如下:

os.path.join(path, *paths)

参数说明:

  1. path:表示要拼接的文件路径。
  2. *paths:表示要拼接的多个文件路径,这些路径间使用逗号进行分隔。如果在要拼接的路径中,没有一个绝对路径,那么最后拼接出来的将是一个相对路径。
  3. 返回值:拼接后的路径。

说明:使用 os.path.join() 函数拼接路径时,并不会检测该路径是否真实存在。

示例代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2022-07-04 0:15
# @Author  : AmoXiang
# @File    : demo4_os_path.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680


import os.path  # 导入os.path模块

print(os.path.join(r"E:\Code\lesson", "main.py"))  # 拼接字符串
# 如果要拼接的路径中,存在多个绝对路径,那么按从左到右顺序,以最后一次出现的绝对路径为准,
# 并且该路径之前的参数都将被忽略,代码如下:

# C:/demo
print(os.path.join('E:/Code', 'E:/Code/lesson', 'Code', 'C:/', 'demo'))  # 拼接字符串

2.6 abspath()方法——获取绝对路径

abspath() 方法用于返回文件或者目录的绝对路径。语法格式如下:

os.path.abspath(path)

参数说明:

  1. path:表示要获取绝对路径的相对路径,可以是文件也可以是目录。
  2. 返回值:返回获取到的绝对路径。

说明:绝对路径是指在使用文件时指定文件的实际路径。它不依赖于当前工作目录。

注意:abspath() 方法在获取实际路径时,并不会检查路径是否真实存在,只是把当前文件目录与 abspath() 方法给定的路径进行拼接。

示例代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2022-07-04 0:15
# @Author  : AmoXiang
# @File    : demo4_os_path.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680


import os.path  # 导入os.path模块

# E:\Code\lesson\python-package\demo4_os_path.py
print(os.path.abspath(r'demo4_os_path.py'))  # 打印绝对路径
# 使用abspath() 方法获取当前Python 文件的绝对路径,代码如下:
print(os.path.abspath(os.path.basename(__file__)))
print(os.path.abspath(__file__))

2.7 basename()方法——从一个路径中提取文件名

basename() 方法用于从一个路径中提取文件名。当指定的路径是一个不包括文件名的路径(如 E:\Code\lesson\) 时,返回空字符串。语法格式如下:

os.path.basename(path)

参数说明:

  1. path:表示要提取文件名的路径。
  2. 返回值:返回提取后的文件名。

示例代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2022-07-04 0:15
# @Author  : AmoXiang
# @File    : demo4_os_path.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680


import os.path  # 导入os.path模块

# message.txt
print(os.path.basename(r"demo\message.txt"))  # 打印文件名message.txt
path1 = 'e:/demo/test.txt'
path2 = 'e:/demo'
path3 = r'E:/Code/lesson/'
print(os.path.basename(path1))  # test.txt
print(os.path.basename(path2))  # demo
# 如果path 以/或 \ 结尾,那么就会返回空值
print(os.path.basename(path3))  # ""

2.8 dirname()方法——获取路径中的目录

dirname() 方法用于从一个路径中提取目录。它相当于使用 os.path.split() 方法分割路径后,得到的第一个元素。语法格式如下:

os.path.dirname(path)

参数说明:

  1. path:表示要提取目录的路径。
  2. 返回值:返回提取后的目录。

示例代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2022-07-04 0:15
# @Author  : AmoXiang
# @File    : demo4_os_path.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680


import os.path  # 导入os.path模块

print(os.path.dirname(r"E:\Code\lesson\python-package\demo\message.txt"))
print(os.path.dirname(r"demo/message.txt"))

2.9 split()方法——分割路径名

split() 方法用于从一个路径中分割出目录和文件名。语法格式如下:

os.path.split(path)

参数说明:

  1. path:表示要分割的路径,可以采用绝对路径,也可以采用相对路径。
  2. 返回值:返回一个元组,与 (os.path.dirname()、os.path.basename()) 返回的元组相同。如果指定的是一个相对路径,并且以斜杠结尾,则返回的元组的第二个元素为空。

使用 split() 方法从绝对路径中分割出盘符、各个文件夹名和文件名,示例代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2022-07-04 0:15
# @Author  : AmoXiang
# @File    : demo4_os_path.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680


import os.path  # 导入os.path模块

lesson_path = r'E:/Code/lesson'  # 代码的路径

folders = []
drive, path_and_file = os.path.splitdrive(lesson_path)  # 分割驱动器和目录
folders.append(drive[0])  # 获取驱动器中的盘符
path, file = os.path.split(path_and_file)  # 分割路径和文件名

if path != '':  # 处理路径
    for i in path.split('/'):  # 将路径按/分隔
        if i != '':
            folders.append(i)

if file != '':  # 处理文件名
    folders.append(file)

print(folders)  # 打印分隔结果

2.10 splitext()方法——分割文件名和扩展名

splitext() 方法用于从一个路径中分割基本文件名和扩展名。语法格式如下:

os.path.splitext(path)

参数说明:

  1. path:表示要分割的路径,可以采用绝对路径,也可以采用相对路径。
  2. 返回值:返回一个元组,它的第一个元素为字符串表示的基本文件名(路径中除扩展名以外的部分),第二个元素为字符串表示的扩展名(包括 . 号)。如果指定的路径中不包括扩展名,则返回元组的第二个元素为空字符串。

示例代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2022-07-04 0:15
# @Author  : AmoXiang
# @File    : demo4_os_path.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680


import os.path  # 导入os.path模块

print(os.path.splitext(r'E:/amo/test/pdf/list.docx'))  # 分割绝对路径
print(os.path.splitext(r'E:/amo/test/pdf/'))  # 分割没有文件名的绝对路径
print(os.path.splitext(r'amo/mot_cn.txt'))  # 分割相对路径
word_path = r'E:/amo/test/pdf/list.docx'  # Word文档的路径
split_path = os.path.splitext(word_path)  # 分割Word文档的路径
pdf_path = split_path[0] + '.pdf'  # 组合PDF文档的路径
print(f'生成的PDF文档路径:{pdf_path}')

2.11 supports_unicode_f ilenames 属性——标记文件系统是否支持 Unicode 文件名

supports_unicode_filenames 属性用于标记当前的文件系统是否支持 Unicode 文件名。语法格式如下:

os.path.supports_unicode_filenames

参数说明:

  1. 返回值:如果文件系统支持 Unicode 文件名,则返回值为 True。

使用 supports_unicode_filenames 属性判断当前系统是否支持 Unicode 文件名。如果支持则创建 座右铭.txt 文件,否则创建 mot.txt 文件,代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2022-07-04 0:15
# @Author  : AmoXiang
# @File    : demo4_os_path.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680


import os.path  # 导入os.path模块

filename = ''  # 保存文件名的变量
print(os.path.supports_unicode_filenames)  # True
if os.path.supports_unicode_filenames:  # 判断是否支持Unicode文件名
    filename = r'座右铭.txt'
else:
    filename = r'mot.txt'
open(filename, 'w')  # 创建或打开文件
# 文件名为: 座右铭.txt
print('文件名为:', filename)  # 打印文件名
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐