os 模块是 Python 内置的与操作系统中的文件系统相关的模块,该模块依赖于操作系统。通常情况下,如不特别指出,该模块提供的方法、属性在Windows 和 UNIX(Linux 和Mac OS X) 系统上都是可用的。
说明:本文的内容都是以 Windows 操作系统为例进行介绍的,所有代码的执行结果也都是在 Windows 操作系统下显示的。关于 UNIX 系统上特有的方法、属性在本文中未列出,如果需要,请查阅 Python 的 API 文档。本文中介绍的使用 os 模块操作文件只是针对一些基本操作,对于高级文件和目录处理,需要使用 shutil 模块。另外,如果想要操作路径,请使用下面介绍的 os.path 模块。
用于定位一个文件或者目录的字符串被称为 路径。在程序开发时,通常涉及到两种路径:一种是相对路径,另一种是绝对路径。
相对路径: 在学习相对路径之前,需要先了解什么是当前工作目录,当前工作目录是指当前文件所在的目录。在 Python 中,可以通过 os 模块提供的 getcwd()
方法获取当前工作目录。例如,在 E:\Code\lesson\python-package\demo3_os.py
文件中,编写以下代码:
import os
print(os.getcwd()) # 打印当前目录
执行上面的代码后,将显示以下目录,该目录就是当前工作目录:
相对路径是依赖于当前工作目录的。如果在当前工作目录下,有一个名称为 message.txt
的文件,那么在打开这个文件时,就可以直接写文件名,这时采用的就是相对路径。message.txt
文件的实际路径就是当前工作目录:
"E:\Code\lesson\python-package" + 相对路径 "message.txt"
即 "E:\Code\lesson\python-package\message.txt"
如果在当前工作目录下,有一个子目录 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
绝对路径:绝对路径是指文件的实际完整路径,它不依赖于当前工作目录,从盘符出发。 在 Python 中,可以通过 os.path
模块提供的 abspath()
方法获取一个文件的绝对路径。例如,获取相对路径 demo\message.txt
的绝对路径,代码如下:
import os
print(os.path.abspath(r"demo\message.txt")) # 打印绝对路径
如果当前工作目录为 E:\Code\lesson\python-package
,则程序运行结果如下:
E:\Code\lesson\python-package\demo\message.txt
os 模块属于内置模块,不需要安装,直接导入即可使用。在 Python 程序中导入 os 模块,需要使用 import 语句,代码如下:
import os
导入 os 模块后,就可以使用该模块提供的属性和方法了。如果不确定该模块都提供了哪些属性和方法,可以使用 Python 的内置函数 dir() 获取全部的方法列表,代码如下:
import os # 导入文件与操作系统相关模块
print(dir(os))
说明: 上面所列出的属性和方法,不仅包括 Windows 和 UNIX 系统公用的,还包括 UNIX 系统独有的,但本文内容不包含 UNIX 系统独有的属性和方法。
getcwd() 方法用于返回表示当前工作目录的字符串。 语法格式如下:
os.getcwd()
参数说明:返回值:返回表示当前工作目录的字符串。使用 getcwd() 方法获取字符串类型的当前工作目录并输出,代码如下:
import os # 导入文件与操作系统相关模块
print(os.getcwd()) # 打印表示当前工作目录的字符串
listdir() 方法用于返回指定路径下的文件和目录的名称(不包括子孙目录)。语法格式如下:
os.listdir(path=".")
参数说明:
.
和 ..
。使用 listdir() 方法获取指定路径下的目录和文件,目录 C:\Users\Administrator\Desktop\python_base
的目录结构如下图所示:
代码如下:
import os # 导入文件与操作系统相关模块
path = os.listdir(r'C:\Users\Administrator\Desktop\python_base') # 获取指定路径下的目录和文件列表
print('目录下包括:', path)
程序运行结果如下:
目录下包括: ['.idea', 'main.py', 'os_demo.py', 'test1']
说明:listdir() 方法的输出结果列表是以字母顺序排列,不区分文件和目录。
使用 listdir() 方法将获取到的指定路径下的目录和文件分别输出,代码如下:
import os # 导入文件与操作系统相关模块
root = r'C:\Users\Administrator\Desktop\python_base'
path = os.listdir(root) # 获取指定路径下的目录和文件列表
list_dir = [] # 路径列表
list_file = [] # 文件列表
for item in path: # 遍历获取到的目录和文件列表
p = os.path.join(root, item) # 连接目录
if os.path.isdir(p): # 判断是否为目录
list_dir.append(p)
elif os.path.isfile(p): # 判断是否为文件
list_file.append(p)
print('目录:', list_dir) # 打印目录列表
print('文件:', list_file) # 打印文件列表
makedirs() 方法用于采用递归方式创建多级目录。 语法格式如下:
def makedirs(name, mode=0o777, exist_ok=False):
参数说明:
使用 makedirs() 方法创建多级目录,代码如下:
import os # 导入文件与操作系统相关模块
os.makedirs(r'amo/qq1/wx1') # 创建目录
运行上面的代码,将创建 amo/qq1/wx1
目录,如下图所示:
mkdir() 方法用于创建一级目录。语法格式如下:
参数说明:
说明:使用 mkdir() 方法只能创建一级目录,即创建目录 C:\Users\Administrator\Desktop\python_base\amo\qq1\wx1\amo1
,且目录 C:\Users\Administrator\Desktop\python_base\amo\qq1\wx1
必须是存在的。
使用 mkdir() 方法创建指定的一级目录,代码如下:
import os # 导入文件与操作系统相关模块
os.mkdir(r'C:\Users\Administrator\Desktop\python_base\amo\qq1\wx1\amo1')
使用 mkdir() 方法在当前目录下创建一个名称为 amo2
的子目录,代码如下:
import os # 导入文件与操作系统相关模块
os.mkdir(r'./amo2')
说明:运行上面的代码,将在当前目录下创建一个名称为 amo2
的子目录。例如,当前目录为 C:\Users\Administrator\Desktop\python_base
,那么将自动创建 C:\Users\Administrator\Desktop\python_base\amo2
目录。
removedirs() 方法用于递归删除目录,即删除多级目录。语法格式如下:
def removedirs(name):
参数说明:
说明:在调用 removedirs() 方法递归删除目录时,只有要删除的目录为空时,才会被删除。
使用 removedirs() 方法删除多级目录 C:\Users\Administrator\Desktop\python_base\amo\qq1\wx1\amo1
,代码如下:
import os # 导入文件与操作系统相关模块
os.removedirs(r"C:\Users\Administrator\Desktop\python_base\amo\qq1\wx1\amo1")
运行上面的代码,C:\Users\Administrator\Desktop\python_base\
目录下的 amo
(包括其子目录)将被删除。
rmdir() 方法用于删除空目录。语法格式如下:
参数说明:
说明:使用 rmdir() 方法只能删除空的目录,如果想要删除非空的目录,则需要使用 Python 内置的标准模块 shutil 的 rmtree() 方法实现。
使用 rmdir() 方法删除 C:\Users\Administrator\Desktop\python_base\test1\a
目录,代码如下:
import os # 导入文件与操作系统相关模块
path = r'C:\Users\Administrator\Desktop\python_base\test1\a' # 指定要删除的目录
"""
注意:如果要删除的目录不存在,那么将抛出 "FileNotFoundError: [WinError 2] 系统找不到指定的文件" 异常。
因此,在执行os.rmdir() 方法前,建议先判断该路径是否存在,可以使用 os.path.exists() 方法判断,代码如下:
"""
if os.path.exists(path): # 判断目录是否存在
os.rmdir(path) # 删除目录
print('目录删除成功!')
else:
print('该目录不存在!')
说明:运行上面的代码,C:\Users\Administrator\Desktop\python_base\test1\
目录下的 a
目录将被删除。
rename() 方法用于将文件或目录重命名。语法格式如下:
os.rename(src,dst,*,src_dir_fd=None,dst_dir_fd=None)
参数说明:
说明:在方法中,如果出现 *
则表示其后面的参数为命名关键字参数,这是一个特殊的分隔符。在调用时,命名关键字参数必须传入参数名。
使用 rename() 方法将 C:\Users\Administrator\Desktop\python_base\
目录下的 main.py
文件重命名为 main_new.py
,代码如下:
import os # 导入文件与操作系统相关模块
os.rename(r'C:\Users\Administrator\Desktop\python_base\main.py',
r'C:\Users\Administrator\Desktop\python_base\main_new.py')
environ 属性用于返回以字符串表示的当前操作系统的环境变量的值。语法格式如下:
os.environ
参数说明:返回值:返回字符串,表示当前环境变量的值。
获取当前环境变量的映射对象,使用 environ 属性获取当前操作系统的环境变量的映射对象,代码如下:
import os # 导入文件与操作系统相关模块
print(os.environ) # 打印当前操作系统的环境变量的映射对象
print(os.environ["PATH"])
先输出指定环境变量的值,并且应用 try…except 语句捕获异常,如果出现异常,说明还没有该环境变量,再创建它,并且输出创建后的环境变量的值,代码如下:
import os # 导入文件与操作系统相关模块
new_var = 'JAVA_HOME' # 环境变量名称
try:
print(os.environ[new_var]) # 打印环境变量的值
print(new_var + '已经存在!值为:')
except:
print("开始创建环境变量.....")
os.environ[new_var] = r'C:\Java\jdk1.8.0_181' # 创建环境变量
print(os.environ[new_var]) # 打印环境变量的值
getlogin() 方法用于返回当前系统的登录用户名。语法格式如下:
os.getlogin()
参数说明:返回值:返回当前系统的登录用户名。
使用 getlogin() 方法输出当前系统的登录用户名,代码如下:
import os # 导入文件与操作系统相关模块
print(os.getlogin()) # 打印当前系统的登录用户名
程序运行结果如下:
Administrator
getpid() 方法用于获取当前进程ID。语法格式如下:
os.getpid()
参数说明:返回值:返回当前进程ID。使用 getpid() 方法获取当前的进程ID,代码如下:
import os # 导入文件与操作系统相关模块
print(os.getpid()) # 打印当前进程ID
getppid() 方法用于获取父进程ID。语法格式如下:
os.getppid()
参数说明:返回值:返回当前进程的父进程ID。当父进程已经结束,在 Unix 系统中返回的ID 是初始进程(1) 中的一个;在 Windows 系统中仍然是同一个进程ID,该进程 ID 有可能已经被运行进程所占用。
import os # 导入文件与操作系统相关模块
print(os.getppid()) # 打印父进程ID
kill() 方法用于杀死进程,并且将 sig 作为退出代码。语法格式如下:
参数说明:
使用 kill() 方法杀死当前进程,并将 9 作为退出代码,代码如下:
import os # 导入文件与操作系统相关模块
os.kill(os.getpid(), 9) # 杀死当前进程
replace() 方法用于重命名文件或目录。语法格式如下:
os.replace(src,dst,*,src_dir_fd=None,dst_dir_fd=None)
参数说明:
说明:
- 在使用replace() 方法重命名目录或文件时,如果指定的新的文件或者目录名称已经存在,则会替换已经存在的文件。
- 在该方法中,如果出现
*
,则表示其后面的参数为命名关键字参数,这是一个特殊的分隔符。在调用时,命名关键字参数必须传入参数名。
将 Z:\test1
目录下的 test2.txt
文件重命名为 test.txt
,代码如下:
import os # 导入文件与操作系统相关模块
os.replace(r"Z:\test1\test2.txt", r"Z:\test1\test.txt")
renames() 方法用于递归重命名目录或文件。语法格式如下:
def renames(old, new):
参数说明:
使用 renames() 方法重命名目录,代码如下:
import os # 导入文件与操作系统相关模块
"""
说明:在使用renames() 方法重命名目录或文件时,如果指定的新的文件或者目录名称已经存在,
则抛出 FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。异常。
"""
os.renames(r'C:\Users\Administrator\Desktop\python_base\test1\b',
r'C:\Users\Administrator\Desktop\python_base\test2\b2') # 重命名目录
walk() 方法用于遍历目录树。语法格式如下:
def walk(top, topdown=True, onerror=None, followlinks=False):
参数说明:
使用 walk() 方法遍历当前目录,代码如下:
import os # 导入文件与操作系统相关模块
tuples = os.walk('./')
for tuple1 in tuples: # 通过for循环输出遍历结果
print(tuple1) # 打印每一级目录的元组
执行上面的代码,将显示以下结果:
('./', ['.idea', 'amo2', 'test2'], ['main_new.py', 'os_demo.py'])
('./.idea', ['inspectionProfiles'], ['.gitignore', 'misc.xml', 'modules.xml', 'python_base.iml', 'workspace.xml'])
('./.idea\\inspectionProfiles', [], ['profiles_settings.xml'])
('./amo2', [], [])
('./test2', ['b2'], [])
('./test2\\b2', [], [])
遍历当前目录,分别输出指定目录下的子目录及文件,不存在子目录或者文件时,显示无,代码如下:
import os # 导入文件与操作系统相关模块
tuples = os.walk('./') # 遍历当前目录
for root, dirs, files in tuples: # 通过for循环打印遍历结果
print('文件目录:', root) # 打印文件目录
print('子目录:', dirs if dirs else '无') # 打印子目录
print('文件:', files if files else '无') # 打印文件
chdir() 方法用于更改当前工作目录为指定的路径。语法格式如下:
os.chdir(path)
参数说明:
使用 chdir() 方法将当前工作目录更改到 Z 盘根目录下,代码如下:
import os # 导入文件与操作系统相关模块
print('更改前的当前工作目录:', os.getcwd())
os.chdir(r'Z:/') # 将当前工作目录更改到Z盘根目录
print('更改后的当前工作目录:', os.getcwd())
首先获取当前工作目录,然后更改当前工作目录并且捕获异常(如果出现异常,则给出提示),最后更改当前工作目录为原来默认的当前工作目录,并输出当前工作目录,代码如下:
import os # 导入文件与操作系统相关模块
default_dir = os.getcwd() # 获取当前工作目录
try:
os.chdir(r'Z:\test1') # 将当前工作目录更改到Z盘的test1目录
print('当前工作目录:', os.getcwd())
except:
print('更改的目录不存在')
finally:
os.chdir(default_dir)
print('当前工作目录:', os.getcwd())
程序运行结果如下:
当前工作目录: Z:\test1
当前工作目录: C:\Users\Administrator\Desktop\python_base