Python os 模块

 
 
 

一、简介

os就是“operating system”的缩写,os模块提供了各种 Python 程序与操作系统进行交互的接口。通过使用os模块,一方面可以方便地与操作系统进行交互,另一方面页可以极大增强代码的可移植性。如果该模块中相关功能出错,会抛出OSError异常或其子类异常。

注意,如果是读写文件的话,建议使用内置函数open();如果是路径相关的操作,建议使用os的子模块os.path;如果要逐行读取多个文件,建议使用fileinput模块;要创建临时文件或路径,建议使用tempfile模块;要进行更高级的文件和路径操作则应当使用shutil模块。

当然,使用os模块可以写出操作系统无关的代码并不意味着os无法调用一些特定系统的扩展功能,但要切记一点:一旦这样做就会极大损害代码的可移植性。

此外,导入os模块时还要小心一点,千万不要为了图调用省事儿而将os模块解包导入,即不要使用from os import *来导入os模块;否则os.open()将会覆盖内置函数open(),从而造成预料之外的错误。

二、常用功能

注意,os模块中大多数接受路径作为参数的函数也可以接受“文件描述符”作为参数。

文件描述符:file descriptor,在 Python 文档中简记为 fd,是一个与某个打开的文件对象绑定的整数,可以理解为该文件在系统中的编号。

2.1.os.name

该属性宽泛地指明了当前 Python 运行所在的环境,实际上是导入的操作系统相关模块的名称。这个名称也决定了模块中哪些功能是可用的,哪些是没有相应实现的。

目前有效名称为以下三个:posixntjava

其中posix是 Portable Operating System Interface of UNIX(可移植操作系统接口)的缩写。Linux 和 Mac OS 均会返回该值;nt全称应为“Microsoft Windows NT”,大体可以等同于 Windows 操作系统,因此 Windows 环境下会返回该值;java则是 Java 虚拟机环境下的返回值。

因此在我的电脑(win10)上执行下述代码,返回值是nt

>>> import os
>>> os.name
'nt'

而在 centos7.3上的结果则是:

>>> import os
>>> os.name
'posix'

查看sys模块中的sys.platform属性可以得到关于运行平台更详细的信息

2.2.os.environ

os.environ属性可以查看系统环境变量信息。返回值是一个映射(类似字典类型),具体的值为第一次导入os模块时的快照;其中的各个键值对,键是环境变量名,值则是环境变量对应的值。在第一次导入os模块之后,除非直接修改os.environ的值,否则该属性的值不再发生变化。

比如其中键为“HOME”的项,对应的值就是用户主目录的路径。Windows 下,其值为:

>>> os.environ['HOME']
'C:\\Users\\Augus\\DOCUME~1\\MOBAXT~1\\home'

Linux 下,其值为:

>>> os.environ["HOME"]
'/root'

2.3.os.walk()

描述

  os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下。

  os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。

  在Unix,Windows中有效。

语法

walk()方法语法格式如下:

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

参数

  • top -- 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。

    • root 所指的是当前正在遍历的这个文件夹的本身的地址
    • dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
    • files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
  • topdown --可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)。如果 topdown 参数为 True,walk 会遍历top文件夹,与top 文件夹中每一个子目录。

  • onerror -- 可选,需要一个 callable 对象,当 walk 需要异常时,会调用。

  • followlinks -- 可选,如果为 True,则会遍历目录下的快捷方式(linux 下是软连接 symbolic link )实际所指的目录(默认关闭),如果为 False,则优先遍历 top 的子目录。

import os
for root, dirs, files in os.walk(".", topdown=False):
    for name in files:
        print(os.path.join(root, name))
    for name in dirs:
        print(os.path.join(root, name))

2.4.os.listdir()

“listdir”即“list directories”,列出(当前)目录下的全部路径(及文件)。该函数存在一个参数,用以指定要列出子目录的路径,默认为“.”,即“当前路径”。

函数返回值是一个列表,其中各元素均为字符串,分别是各路径名和文件名。通常在需要遍历某个文件夹中文件的场景下极为实用

import os

#.代指指定从当前目前开始查找,找出所有的文件或者目录,结果存放在列表中
list_directory = os.listdir(".")
filelists = []

#遍历列表,做判断,将文件存放在filelists中
for directory in list_directory:
    # os.path 模块稍后会讲到
    if os.path.isfile(directory):
        filelists.append(directory)

print(filelists)

2.5.os.mkdir()

“mkdir”,即“make directory”,用处是“新建一个路径”。需要传入一个类路径参数用以指定新建路径的位置和名称,如果指定路径已存在,则会抛出FileExistsError异常。

该函数只能在已有的路径下新建一级路径,否则(即新建多级路径)会抛出FileNotFoundError异常。

相应地,在需要新建多级路径的场景下,可以使用os.makedirs()来完成任务。函数os.makedirs()执行的是递归创建,若有必要,会分别新建指定路径经过的中间路径,直到最后创建出末端的“叶子路径”。

示例如下:

import os

os.mkdir("th")

2.6.os.remove()

用于删除文件,如果指定路径是目录而非文件的话,就会抛出 IsADirectoryError异常。删除目录应该使用os.rmdir()函数。

2.7.os.rename()

该函数的作用是将文件或路径重命名,一般调用格式为os.rename(src, dst),即将src指向的文件或路径重命名为dst指定的名称。

注意,如果指定的目标路径在其他目录下,该函数还可实现文件或路径的“剪切并粘贴”功能。但无论直接原地重命名还是“剪切粘贴”,中间路径都必须要存在,否则就会抛出FileNotFoundError异常。如果目标路径已存在,Windows 下会抛出FileExistsError异常;Linux 下,如果目标路径为空且用户权限允许,则会静默覆盖原路径,否则抛出OSError异常,

和上两个函数一样,该函数也有对应的递归版本os.renames(),能够创建缺失的中间路径。

注意,这两种情况下,如果函数执行成功,都会调用os.removedir()函数来递归删除源路径的最下级目录。

import os

#将当前目录下web文件夹改名为web1
os.rename("web","web1")

2.8.os.getcwd()

“getcwd”实际上是“get the current working directory”的简写,顾名思义,也就是说这个函数的作用是“获取当前工作路径”。在程序运行的过程中,无论物理上程序在实际存储空间的什么地方,“当前工作路径”即可认为是程序所在路径;与之相关的“相对路径”、“同目录下模块导入”等相关的操作均以“当前工作路径”为准。

在交互式环境中,返回的就是交互终端打开的位置;而在 Python 文件中,返回的则是文件所在的位置。

import os

#输入当前的工作路径
print(os.getcwd())

2.9.os.chdir()

“chdir”其实是“change the directory”的简写,因此os.chdir()的用处实际上是切换当前工作路径为指定路径。其中“指定路径”需要作为参数传入函数os.chdir(),该参数既可以是文本或字节型字符串,也可以是一个文件描述符,还可以是一个广义的类路径(path-like)对象。若指定路径不存在,则会抛出FileNotFoundError异常。

实例:

>>> import os
>>>
>>> os.getcwd()
'E:\\samplecode'
#将工作目前切换到c盘 >>> os.chdir("c:/") >>> os.getcwd() 'c:\\' >>>

三、os.path 模块

其实这个模块是os模块根据系统类型从另一个模块导入的,并非直接由os模块实现,比如os.name值为nt,则在os模块中执行import ntpath as path;如果os.name值为posix,则导入posixpath

使用该模块要注意一个很重要的特性:os.path中的函数基本上是纯粹的字符串操作。换句话说,传入该模块函数的参数甚至不需要是一个有效路径,该模块也不会试图访问这个路径,而仅仅是按照“路径”的通用格式对字符串进行处理。

更进一步地说,os.path模块的功能我们都可以自己使用字符串操作手动实现,该模块的作用是让我们在实现相同功能的时候不必考虑具体的系统,尤其是不需要过多关注文件系统分隔符的问题。

3.1.os.path.join()

这是一个十分实用的函数,可以将多个传入路径组合为一个路径。实际上是将传入的几个字符串用系统的分隔符连接起来,组合成一个新的字符串,所以一般的用法是将第一个参数作为父目录,之后每一个参数即使下一级目录,从而组合成一个新的符合逻辑的路径。

但如果传入路径中存在一个“绝对路径”格式的字符串,且这个字符串不是函数的第一个参数,那么其他在这个参数之前的所有参数都会被丢弃,余下的参数再进行组合。更准确地说,只有最后一个“绝对路径”及其之后的参数才会体现在返回结果中。

import os

reportpath = os.path.join("d:/", "python", "课后复习")
print(reportpath)

3.2.os.path.abspath()

将传入路径规范化,返回一个相应的绝对路径格式的字符串。

也就是说当传入路径符合“绝对路径”的格式时,该函数仅仅将路径分隔符替换为适应当前系统的字符,不做其他任何操作,并将结果返回。所谓“绝对路径的格式”,其实指的就是一个字母加冒号,之后跟分隔符和字符串序列的格式:

import os

#指定构造路径
reportpath = os.path.join("d:/", "python", "课后复习")
#替换为适应当前系统的字符
specificationpath = os.path.abspath(reportpath)
print(specificationpath)

当指定的路径不符合上述格式时,该函数会自动获取当前工作路径,并使用os.path.join()函数将其与传入的参数组合成为一个新的路径字符串。示例如下:

>>> import os
>>> os.getcwd()
'E:\\samplecode'
#当输入的不是合法的路径时,则会使用当前工作路径加输入的非法路径进行拼接 >>> os.path.abspath("hello") 'E:\\samplecode\\hello'

3.3.os.path.basename()

该函数返回传入路径的“基名”,即传入路径的最下级目录。

import os

dirpath = os.path.basename("d:/tools/apache-jmeter-5.3")
print(dirpath)

整这个函数要注意的一点是,返回的“基名”实际上是传入路径最后一个分隔符之后的子字符串,也就是说,如果最下级目录之后还有一个分隔符,得到的就会是一个空字符串:

import os

dirpath = os.path.basename("d:/tools/apache-jmeter-5.3/")
print(dirpath)

3.4.os.path.dirname()

与上一个函数正好相反,返回的是最后一个分隔符前的整个字符串:

>>> import os
>>> os.path.dirname("d:/tools/apache-jmeter-5.3")
'd:/tools'
>>> os.path.dirname("d:/tools/apache-jmeter-5.3/") 
'd:/tools/apache-jmeter-5.3'

3.5.os.path.split()

函数os.path.split()的功能就是将传入路径以最后一个分隔符为界,分成两个字符串,并打包成元组的形式返回;前两个函数os.path.dirname()os.path.basename()的返回值分别是函数os.path.split()返回值的第一个、第二个元素。

>>> import os
>>> os.path.split("d:/tools/apache-jmeter-5.3")
('d:/tools', 'apache-jmeter-5.3')

3.6.os.path.exists()

这个函数用于判断路径所指向的位置是否存在。若存在则返回True,不存在则返回False

>>> import os
>>> os.path.exists("d:/tools")
True
>>> os.path.exists("d:/tools/hello")
False
>>>

一般的用法是在需要持久化保存某些数据的场景,为避免重复创建某个文件,需要在写入前用该函数检测一下相应文件是否存在,若不存在则新建,若存在则在文件内容之后增加新的内容。

3.7.os.path.isabs()

该函数判断传入路径是否是绝对路径,若是则返回True,否则返回False。当然,仅仅是检测格式,同样不对其有效性进行任何核验:

>>> import os
>>> os.path.isabs("d:/tools/hello")
True
>>>

3.8.os.path.isfile() 和 os.path.isdir()

这两个函数分别判断传入路径是否是文件或路径,注意,此处会核验路径的有效性,如果是无效路径将会持续返回False

>>> import os
>>> os.path.isdir("d:/tools")
True
>>> os.path.isdir("d:/tools/hello")
False
>>>
>>>import os
>>> os.path.isfile("d:/jmeterBeanShell/BeanShellMethod.class")
True
>>> os.path.isfile("d:/jmeterBeanShell/BeanShellMethod.class1")
False
posted @ 2020-11-23 12:27  酒剑仙*  阅读(580)  评论(0)    收藏  举报