目录
- 一、os模块介绍
- 二、路径介绍
- 三、常用方法详解
- 3.1 getcwd()方法——获取当前工作目录(字符串)
- 3.2 listdir()方法——返回指定路径下的目录名和文件名
- 3.3 makedirs()方法——递归创建目录
- 3.4 mkdir()方法——创建一级目录
- 3.5 removedirs()方法——递归删除目录
- 3.6 rmdir()方法——删除空目录
- 3.7 rename()方法——重命名文件或目录
- 3.8 environ属性——获取当前环境变量的值(字符串)
- 3.9 getlogin()方法——获取系统的登录用户名 我觉得好玩
- 3.10 getpid()方法——获取当前进程ID
- 3.11 getppid()方法——获取父进程ID
- 3.12 kill()方法——杀死进程
- 3.13 replace()方法——重命名文件或目录
- 3.14 renames()方法——递归重命名目录或文件
- 3.15 walk()方法——遍历目录树
- 3.16 chdir()方法——更改当前工作目录
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 osprint(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 osprint(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 系统独有的属性和方法。
3.1 getcwd()方法——获取当前工作目录(字符串)
getcwd() 方法用于返回表示当前工作目录的字符串。 语法格式如下:
os.getcwd()
参数说明:返回值:返回表示当前工作目录的字符串。使用 getcwd() 方法获取字符串类型的当前工作目录并输出,代码如下:
import os # 导入文件与操作系统相关模块print(os.getcwd()) # 打印表示当前工作目录的字符串
程序运行结果如下图所示:
3.2 listdir()方法——返回指定路径下的目录名和文件名
listdir() 方法用于返回指定路径下的文件和目录的名称(不包括子孙目录)。语法格式如下:
os.listdir(path=".")
参数说明:
- path:表示一个路径,用于指定要获取的文件和目录的根目录,不能是文件路径。
- 返回值:返回一个列表,其中包含 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) # 打印文件列表
程序运行结果如下:
3.3 makedirs()方法——递归创建目录
makedirs() 方法用于采用递归方式创建多级目录。 语法格式如下:
def makedirs(name, mode=0o777, exist_ok=False):
参数说明:
- name:用于指定要创建目录的路径。
- mode:指定目录的模式,默认模式为八进制的 777。类似于 chmod() 方法。
- exist_ok:可选参数,如果值为 False,当要创建的目录已经存在时,抛出 FileExistsError 异常;如果值为True,当要创建的目录已经存在时,不会抛出异常。默认值为 False。
- 返回值:无。
使用 makedirs() 方法创建多级目录,代码如下:
import os # 导入文件与操作系统相关模块os.makedirs(r'amo/qq1/wx1') # 创建目录
运行上面的代码,将创建 amo/qq1/wx1
目录,如下图所示:
3.4 mkdir()方法——创建一级目录
mkdir() 方法用于创建一级目录。语法格式如下:
参数说明:
- path:用于指定要创建目录的路径。
- mode:表示指定目录的模式,默认模式为八进制的 777。类似于chmod() 方法。
- dir_fd :表示指定打开文件描述符的路径。默认值为 None。
- 返回值:无。
说明:使用 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
目录。
3.5 removedirs()方法——递归删除目录
removedirs() 方法用于递归删除目录,即删除多级目录。语法格式如下:
def removedirs(name):
参数说明:
- name:用于指定要删除目录的路径。该目录中,最后一级目录必须为空,否则将抛出
OSError:[WinError 145] 目录不是空的
异常。
- 返回值:无。
说明:在调用 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
(包括其子目录)将被删除。
3.6 rmdir()方法——删除空目录
rmdir() 方法用于删除空目录。语法格式如下:
参数说明:
- path:表示要删除的目录,可以使用相对路径,也可以使用绝对路径。
- dir_fd :可选参数,用于指定要删除目录的相对于目录描述符的路径,而不是遵循符号链接(软链接)。
- 返回值:无。
说明:使用 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
目录将被删除。
3.7 rename()方法——重命名文件或目录
rename() 方法用于将文件或目录重命名。语法格式如下:
os.rename(src,dst,*,src_dir_fd=None,dst_dir_fd=None)
参数说明:
- src :表示字符串类型的路径,用于指定需要进行重命名的文件或目录的路径。
- dst:表示字符串类型的路径,用于指定新的文件或目录名称。如果指定的路径已经存在,则多数系统下将抛出 FileExistsError 异常。
- src_dir_fd :可选参数,用于指定源地址的相对于目录描述符的路径,而不是遵循符号链接(软链接)。
- dst_dir_fd :可选参数,用于指定目标地址的相对于目录描述符的路径,而不是遵循符号链接(软链接)。
- 返回值:无。
说明:在方法中,如果出现 *
则表示其后面的参数为命名关键字参数,这是一个特殊的分隔符。在调用时,命名关键字参数必须传入参数名。
使用 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')
3.8 environ属性——获取当前环境变量的值(字符串)
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]) # 打印环境变量的值
3.9 getlogin()方法——获取系统的登录用户名 我觉得好玩
getlogin() 方法用于返回当前系统的登录用户名。语法格式如下:
os.getlogin()
参数说明:返回值:返回当前系统的登录用户名。
使用 getlogin() 方法输出当前系统的登录用户名,代码如下:
import os # 导入文件与操作系统相关模块print(os.getlogin()) # 打印当前系统的登录用户名
程序运行结果如下:
Administrator
3.10 getpid()方法——获取当前进程ID
getpid() 方法用于获取当前进程ID。语法格式如下:
os.getpid()
参数说明:返回值:返回当前进程ID。使用 getpid() 方法获取当前的进程ID,代码如下:
import os # 导入文件与操作系统相关模块print(os.getpid()) # 打印当前进程ID
3.11 getppid()方法——获取父进程ID
getppid() 方法用于获取父进程ID。语法格式如下:
os.getppid()
参数说明:返回值:返回当前进程的父进程ID。当父进程已经结束,在 Unix 系统中返回的ID 是初始进程(1) 中的一个;在 Windows 系统中仍然是同一个进程ID,该进程 ID 有可能已经被运行进程所占用。
import os # 导入文件与操作系统相关模块print(os.getppid()) # 打印父进程ID
3.12 kill()方法——杀死进程
kill() 方法用于杀死进程,并且将 sig 作为退出代码。语法格式如下:
参数说明:
- _pid:用于指定当前进程ID,可以使用 os.getpid() 方法获取。
- _signal:用于指定退出代码。
- 返回值:无。
使用 kill() 方法杀死当前进程,并将 9 作为退出代码,代码如下:
import os # 导入文件与操作系统相关模块os.kill(os.getpid(), 9) # 杀死当前进程
3.13 replace()方法——重命名文件或目录
replace() 方法用于重命名文件或目录。语法格式如下:
os.replace(src,dst,*,src_dir_fd=None,dst_dir_fd=None)
参数说明:
- src :表示字符串类型的路径,用于指定需要进行重命名的文件或目录的路径。
- dst:表示字符串类型的路径,用于指定新的文件或目录名称。
- src_dir_fd :可选参数,用于指定源地址的相对于目录描述符的路径,而不是遵循符号链接(软链接)。
- dst_dir_fd :可选参数,用于指定目标地址的相对于目录描述符的路径,而不是遵循符号链接(软链接)。
- 返回值:无。
说明:
- 在使用replace() 方法重命名目录或文件时,如果指定的新的文件或者目录名称已经存在,则会替换已经存在的文件。
- 在该方法中,如果出现
*
,则表示其后面的参数为命名关键字参数,这是一个特殊的分隔符。在调用时,命名关键字参数必须传入参数名。
将 Z:\test1
目录下的 test2.txt
文件重命名为 test.txt
,代码如下:
import os # 导入文件与操作系统相关模块os.replace(r"Z:\test1\test2.txt", r"Z:\test1\test.txt")
3.14 renames()方法——递归重命名目录或文件
renames() 方法用于递归重命名目录或文件。语法格式如下:
def renames(old, new):
参数说明:
- src:表示字符串类型的路径,用于指定需要进行重命名的文件或目录的路径。
- dst:表示字符串类型的路径,用于指定新的文件或目录名称。如果指定的路径已经存在,则多数系统将抛出 FileExistsError 异常。
- 返回值:无。
使用 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') # 重命名目录
3.15 walk()方法——遍历目录树
walk() 方法用于遍历目录树。语法格式如下:
def walk(top, topdown=True, onerror=None, followlinks=False):
参数说明:
- top:用于指定要遍历内容的根目录。
- topdown:可选参数,用于指定遍历的顺序。如果值为True,表示自上而下遍历(即先遍历根目录);如果值为 False,表示自下而上遍历(即先遍历最后一级子目录)。默认值为 True。
- onerror:可选参数,用于指定错误处理方式,默认为忽略。如果不想忽略,也可以指定一个错误处理函数。通常情况下采用默认。
- followlinks:可选参数,默认情况下,walk() 方法不会向下转换成解析到目录的符号链接。将该参数值设置为 True,表示用于指定在支持的系统上访问由符号链接指向的目录。
- 返回值:返回一个包括3 个元素(dirpath, dirnames, filenames) 的元组生成器对象。其中,dirpath 表示当前遍历的路径,是一个字符串;dirnames 表示当前路径下包含的子目录,是一个列表;filenames 表示当前路径下包含的文件,也是一个列表。
使用 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 '无') # 打印文件
3.16 chdir()方法——更改当前工作目录
chdir() 方法用于更改当前工作目录为指定的路径。语法格式如下:
os.chdir(path)
参数说明:
- 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