python os模块
1. 简介
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()
,从而造成预料之外的错误。
2. 常用功能
注意,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 虚拟机环境下的返回值。
2.2 os.environ
os.environ
属性可以返回环境相关的信息,主要是各类环境变量。返回值是一个映射(类似字典类型),具体的值为第一次导入os
模块时的快照;其中的各个键值对,键是环境变量名,值则是环境变量对应的值。在第一次导入os
模块之后,除非直接修改os.environ
的值,否则该属性的值不再发生变化。
"HOMEPATH"] os.environ[ |
2.3 os.listdir()
“listdir”即“list directories”,列出(当前)目录下的全部路径(及文件)。该函数存在一个参数,用以指定要列出子目录的路径,默认为“.”
,即“当前路径”。函数返回值是一个列表,其中各元素均为字符串,分别是各路径名和文件名。
2.4 os.mkdir()
“mkdir”,即“make directory”,用处是“新建一个路径”。需要传入一个类路径参数用以指定新建路径的位置和名称,如果指定路径已存在,则会抛出FileExistsError
异常。
2.5 os.remove()
用于删除文件,如果指定路径是目录而非文件的话,就会抛出IsADirectoryError
异常。删除目录应该使用os.rmdir()
函数。
2.6 os.rename()
该函数的作用是将文件或路径重命名,一般调用格式为os.rename(src, dst)
,即将src
指向的文件或路径重命名为dst
指定的名称。
2.7 os.getcwd()
“getcwd”实际上是“get the current working directory”的简写,顾名思义,也就是说这个函数的作用是“获取当前工作路径”。在程序运行的过程中,无论物理上程序在实际存储空间的什么地方,“当前工作路径”即可认为是程序所在路径;与之相关的“相对路径”、“同目录下模块导入”等相关的操作均以“当前工作路径”为准。
2.8 os.chdir()
“chdir”其实是“change the directory”的简写,因此os.chdir()
的用处实际上是切换当前工作路径为指定路径。其中“指定路径”需要作为参数传入函数os.chdir()
,该参数既可以是文本或字节型字符串,也可以是一个文件描述符,还可以是一个广义的类路径(path-like)对象。若指定路径不存在,则会抛出FileNotFoundError
异常。
3. 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()
这是一个十分实用的函数,可以将多个传入路径组合为一个路径。实际上是将传入的几个字符串用系统的分隔符连接起来,组合成一个新的字符串,所以一般的用法是将第一个参数作为父目录,之后每一个参数即使下一级目录,从而组合成一个新的符合逻辑的路径。
但如果传入路径中存在一个“绝对路径”格式的字符串,且这个字符串不是函数的第一个参数,那么其他在这个参数之前的所有参数都会被丢弃,余下的参数再进行组合。更准确地说,只有最后一个“绝对路径”及其之后的参数才会体现在返回结果中。
"just", "do", "python", "dot", "com") os.path.join( |
3.2 os.path.split()
函数os.path.split()
的功能就是将传入路径以最后一个分隔符为界,分成两个字符串,并打包成元组的形式返回.
通过os.path.join()
函数又可以把它们组合起来得到原先的路径。
3.3 os.path.isfile() 和 os.path.isdir()
这两个函数分别判断传入路径是否是文件或路径,注意,此处会核验路径的有效性,如果是无效路径将会持续返回False
。
# 无效路径 |