Python 常用基础模块:os模块

Posted Amo Xiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 常用基础模块:os模块相关的知识,希望对你有一定的参考价值。

目录

一、os模块介绍

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 系统独有的属性和方法。

三、常用方法详解

3.1 getcwd()方法——获取当前工作目录(字符串)

getcwd() 方法用于返回表示当前工作目录的字符串。 语法格式如下:

os.getcwd()

参数说明:返回值:返回表示当前工作目录的字符串。使用 getcwd() 方法获取字符串类型的当前工作目录并输出,代码如下:

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

print(os.getcwd())  # 打印表示当前工作目录的字符串

程序运行结果如下图所示:

3.2 listdir()方法——返回指定路径下的目录名和文件名

listdir() 方法用于返回指定路径下的文件和目录的名称(不包括子孙目录)。语法格式如下:

os.listdir(path=".")

参数说明:

  1. path:表示一个路径,用于指定要获取的文件和目录的根目录,不能是文件路径。
  2. 返回值:返回一个列表,其中包含 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):

参数说明:

  1. name:用于指定要创建目录的路径。
  2. mode:指定目录的模式,默认模式为八进制的 777。类似于 chmod() 方法。
  3. exist_ok:可选参数,如果值为 False,当要创建的目录已经存在时,抛出 FileExistsError 异常;如果值为True,当要创建的目录已经存在时,不会抛出异常。默认值为 False。
  4. 返回值:无。

使用 makedirs() 方法创建多级目录,代码如下:

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

os.makedirs(r'amo/qq1/wx1')  # 创建目录

运行上面的代码,将创建 amo/qq1/wx1 目录,如下图所示:

3.4 mkdir()方法——创建一级目录

mkdir() 方法用于创建一级目录。语法格式如下:

参数说明:

  1. path:用于指定要创建目录的路径。
  2. mode:表示指定目录的模式,默认模式为八进制的 777。类似于chmod() 方法。
  3. dir_fd :表示指定打开文件描述符的路径。默认值为 None。
  4. 返回值:无。

说明:使用 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):

参数说明:

  1. name:用于指定要删除目录的路径。该目录中,最后一级目录必须为空,否则将抛出 OSError:[WinError 145] 目录不是空的 异常。
  2. 返回值:无。

说明:在调用 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() 方法用于删除空目录。语法格式如下:

参数说明:

  1. path:表示要删除的目录,可以使用相对路径,也可以使用绝对路径。
  2. dir_fd :可选参数,用于指定要删除目录的相对于目录描述符的路径,而不是遵循符号链接(软链接)。
  3. 返回值:无。

说明:使用 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)

参数说明:

  1. src :表示字符串类型的路径,用于指定需要进行重命名的文件或目录的路径。
  2. dst:表示字符串类型的路径,用于指定新的文件或目录名称。如果指定的路径已经存在,则多数系统下将抛出 FileExistsError 异常。
  3. src_dir_fd :可选参数,用于指定源地址的相对于目录描述符的路径,而不是遵循符号链接(软链接)。
  4. dst_dir_fd :可选参数,用于指定目标地址的相对于目录描述符的路径,而不是遵循符号链接(软链接)。
  5. 返回值:无。

说明:在方法中,如果出现 * 则表示其后面的参数为命名关键字参数,这是一个特殊的分隔符。在调用时,命名关键字参数必须传入参数名。

使用 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 作为退出代码。语法格式如下:

参数说明:

  1. _pid:用于指定当前进程ID,可以使用 os.getpid() 方法获取。
  2. _signal:用于指定退出代码。
  3. 返回值:无。

使用 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)

参数说明:

  1. src :表示字符串类型的路径,用于指定需要进行重命名的文件或目录的路径。
  2. dst:表示字符串类型的路径,用于指定新的文件或目录名称。
  3. src_dir_fd :可选参数,用于指定源地址的相对于目录描述符的路径,而不是遵循符号链接(软链接)。
  4. dst_dir_fd :可选参数,用于指定目标地址的相对于目录描述符的路径,而不是遵循符号链接(软链接)。
  5. 返回值:无。

说明:

  1. 在使用replace() 方法重命名目录或文件时,如果指定的新的文件或者目录名称已经存在,则会替换已经存在的文件。
  2. 在该方法中,如果出现 * ,则表示其后面的参数为命名关键字参数,这是一个特殊的分隔符。在调用时,命名关键字参数必须传入参数名。

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):

参数说明:

  1. src:表示字符串类型的路径,用于指定需要进行重命名的文件或目录的路径。
  2. dst:表示字符串类型的路径,用于指定新的文件或目录名称。如果指定的路径已经存在,则多数系统将抛出 FileExistsError 异常。
  3. 返回值:无。

使用 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):

参数说明:

  1. top:用于指定要遍历内容的根目录。
  2. topdown:可选参数,用于指定遍历的顺序。如果值为True,表示自上而下遍历(即先遍历根目录);如果值为 False,表示自下而上遍历(即先遍历最后一级子目录)。默认值为 True。
  3. onerror:可选参数,用于指定错误处理方式,默认为忽略。如果不想忽略,也可以指定一个错误处理函数。通常情况下采用默认。
  4. followlinks:可选参数,默认情况下,walk() 方法不会向下转换成解析到目录的符号链接。将该参数值设置为 True,表示用于指定在支持的系统上访问由符号链接指向的目录。
  5. 返回值:返回一个包括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)

参数说明:

  1. path:用于指定文件路径。
  2. 返回值:无。

使用 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

以上是关于Python 常用基础模块:os模块的主要内容,如果未能解决你的问题,请参考以下文章

python常用模块基础

详解Python基础操作之os模块常用命令

python基础os.path模块常用方法详解

Python基础之模块

Python基础理论 - 常用模块

python基础之模块(time,datetime,os,random)