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 运行所在的环境,实际上是导入的操作系统相关模块的名称。这个名称也决定了模块中哪些功能是可用的,哪些是没有相应实现的。
目前有效名称为以下三个:posix,nt,java。
其中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

浙公网安备 33010602011771号