python os模块的一些方法

237 阅读11分钟

文章内容绝大部分来源于python3.10标准库

docs.python.org/zh-cn/3.10/…

下列方法支持windows上运行

文件和目录

在某些Unix平台上,许多函数支持以下一项或多项功能

指定文件描述符为参数: 通常在 os 模块中提供给函数的 path 参数必须是表示文件路径的字符串,但是,某些函数现在可以接受其 path 参数为打开文件描述符,该函数将对描述符指向的文件进行操作。(对于 POSIX 系统,Python 将调用以 f 开头的函数变体(如调用 fchdir 而不是 chdir)。)

可以用 os.supports_fd 检查某个函数在你的平台上是否支持将 path 参数指定为文件描述符。如果不支持,使用该功能将抛出 NotImplementedError 异常。

如果该函数还支持 dir_fd 或 follow_symlinks 参数,那么用文件描述符作为 path 后就不能再指定上述参数了。

基于目录描述符的相对路径: 如果 dir_fd 不是 None,它就应该是一个指向目录的文件描述符,这时待操作的 path 应该是相对路径,相对路径是相对于前述目录的。如果 path 是绝对路径,则 dir_fd 将被忽略。(对于 POSIX 系统,Python 将调用该函数的变体,变体以 at 结尾,可能以 f 开头(如调用 faccessat 而不是 access)。

可以用 os.supports_dir_fd 检查某个函数在你的平台上是否支持 dir_fd。如果不支持,使用该功能将抛出 NotImplementedError 异常。

不跟踪符号链接: 如果 follow_symlinks 为 False,并且待操作路径的最后一个元素是符号链接,则该函数将在符号链接本身而不是链接所指向的文件上操作。(对于 POSIX 系统,Python 将调用该函数的 l... 变体。)

可以用 os.supports_follow_symlinks 检查某个函数在你的平台上是否支持 follow_symlinks。如果不支持,使用该功能将抛出 NotImplementedError 异常。

os.access(path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True)

使用 实际用户ID/用户组ID 测试对 path 的访问。

path:用于测试的路径,可以是字符串、字节或者是类似路径的对象。

mode:mode 为 F_OK 时用于测试 path 是否存在,也可以对 R_OK、W_OK 和 X_OK 中的一个或多个进行“或”运算来测试指定权限。允许访问则返回 True,否则返回 False。F_OK、R_OK、W_OK 和 X_OK作为access()的mode参数的可选值,分别测试path的存在性、可读性、可写性和可执行性

dir_fd:如果不为空,则表示为基于当前目录的相对路径文件描述符。

effective_ids:如果effective_ids为True,access()将使用有效用户ID/用户组ID而非实际用户ID/用户组ID进行访问检查。

follow_symlinks:如果为False,路径的最后一个元素是符号链接,access()将检查符号链接本身,而不是文件链接指向。

dir_fd、effecve_ids和follow_symlinks可能无法在您的平台上实现。如果不可用,使用它们将引发NotImplementedError。

注意,大多数操作将使用有效的uid/gid,因此可以在suid/sgid环境中使用此例程来测试调用用户是否具有对路径的指定访问权。

例子:

if os.access("myfile", os.R_OK):
    with open("myfile") as fp:
        return fp.read()
return "some default data"

注解 使用 access() 来检查用户是否具有某项权限(如打开文件的权限),然后再使用 open() 打开文件,这样做存在一个安全漏洞,因为用户可能会在检查和打开文件之间的时间里做其他操作。推荐使用 EAFP 技术。以上代码最好写成:

try:
    fp = open("myfile")
except PermissionError:
    return "some default data"
else:
    with fp:
        return fp.read()

注解 即使 access() 指示 I/O 操作会成功,但实际操作仍可能失败,尤其是对网络文件系统的操作,其权限语义可能超出常规的 POSIX 权限模型

os.chdir(path)

将当前工作目录更改为 path。

本函数支持指定文件描述符为参数。其中,描述符必须指向打开的目录,不能是打开的文件。

本函数可以抛出 OSError 及其子类的异常,如 FileNotFoundError、PermissionError 和 NotADirectoryError 异常。

引发一个 审计事件 os.chdir,附带参数 path。

os.getcwd()

返回表示当前工作目录的字符串。

os.getcwdb()

返回表示当前工作目录的字节串 (bytestring)。

os.link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True)

创建一个指向 src 的硬链接,名为 dst。

本函数支持将 src_dir_fd 和 dst_dir_fd 中的一个或两个指定为基于目录描述符的相对路径,支持不跟踪符号链接。

引发一个 审计事件 os.link 附带参数 src、dst、src_dir_fd、dst_dir_fd。

如果follow_symlinks为False,并且src的最后一个元素是符号链接,则link将创建指向符号链接本身的链接,而不是指向该链接所指向的文件。

Src_dir_fd、dst_dir_fd和follow_symlinks可能无法在您的平台上实现。如果不可用,使用它们将引发NotImplementedError。

os.listdir(path='.')

返回一个包含由path指定目录中条目名称组成的列表。 该列表按任意顺序排列,并且不包括特殊条目 '.' 和 '..',即使它们存在于目录中。 如果有文件在调用此函数期间在被移除或添加到目录中,是否要包括该文件的名称并没有规定。

path可以是类路径对象。如果path是(直接传入或通过 PathLike 接口间接传入)bytes类型,则返回的文件名也将是 bytes 类型,其他情况下是str类型。

本函数也支持 指定文件描述符为参数,其中描述符必须指向目录。

引发一个 审计事件 os.listdir,附带参数 path。

注解 要将 str 类型的文件名编码为 bytes,请使用 fsencode()。

参见 scandir() 函数返回目录内文件名的同时,也返回文件属性信息,它在某些具体情况下能提供更好的性能。

os.lstat(path, *, dir_fd=None)

在给定路径上执行本函数,其操作相当于lstat()系统调用,类似于stat()但不跟踪符号链接。返回值是stat_result对象。

在不支持符号链接的平台上,本函数是stat()的别名。

从Python3.3起,此功能等价于os.stat(path, dir_fd=dir_fd, follow_symlinks=False)。

本函数支持基于目录描述符的相对路径。

os.mkdir(path, mode=0o777, *, dir_fd=None)

创建一个名为 path 的目录,应用以数字表示的权限模式 mode。

如果目录已经存在, FileExistsError 会被提出。如果路径中的父目录不存在,则会引发 FileNotFoundError 。

某些系统会忽略 mode。如果没有忽略它,那么将首先从它中减去当前的 umask 值。如果除最后 9 位(即 mode 八进制的最后 3 位)之外,还设置了其他位,则其他位的含义取决于各个平台。在某些平台上,它们会被忽略,应显式调用 chmod() 进行设置。

本函数支持 基于目录描述符的相对路径。

如果需要创建临时目录,请参阅 tempfile 模块中的 tempfile.mkdtemp() 函数。

引发一个 审计事件 os.mkdir,附带参数 path、mode、dir_fd。

os.makedirs(name, mode=0o777, exist_ok=False)

递归目录创建函数。与 mkdir() 类似,但会自动创建到达最后一级目录所需要的中间目录。工作方式类似于mkdir,但是如果中间路径段(不仅仅是最右边的)不存在,则会创建它。如果目标目录已经存在,如果exist_ok为False则引发OSError,否则不会引发异常。

要设置任何新创建的父目录的文件权限位,可以在调用makedirs()之前设置umask。已存在的父目录的文件权限位没有改变。

如果 exist_ok 为 False (默认值),则如果目标目录已存在将引发 FileExistsError。

注解 如果要创建的路径元素包含 pardir (如 UNIX 系统中的 "..") makedirs() 将无法明确目标。

本函数能正确处理 UNC 路径。

引发一个 审计事件 os.mkdir,附带参数 path、mode、dir_fd。

os.readlink(path, *, dir_fd=None)

返回一个字符串,为符号链接指向的实际路径。其结果可以是绝对或相对路径。如果是相对路径,则可用 os.path.join(os.path.dirname(path), result) 转换为绝对路径。

如果 path 是字符串对象(直接传入或通过 PathLike 接口间接传入),则结果也将是字符串对象,且此类调用可能会引发 UnicodeDecodeError。如果 path 是字节对象(直接传入或间接传入),则结果将会是字节对象。

本函数支持基于目录描述符的相对路径。

当尝试解析的路径可能含有链接时,请改用realpath()以正确处理递归和平台差异。

os.remove(path, *, dir_fd=None)

移除(删除)文件路径。如果path是一个目录,则会引发OSError,需要使用rmdir()删除目录。如果文件不存在,将引发FileNotFoundError。

本函数支持 基于目录描述符的相对路径。

在 Windows 上,尝试删除正在使用的文件会抛出异常。而在 Unix 上,虽然该文件的条目会被删除,但分配给文件的存储空间仍然不可用,直到原始文件不再使用为止。

本函数在语义上与 unlink() 相同。

引发一个 审计事件 os.remove,附带参数 path、dir_fd。

os.removedirs(name)

递归删除目录。工作方式类似于 rmdir(),不同之处在于,如果成功删除了末尾一级目录,removedirs() 会尝试依次删除 path 中提到的每个父目录,直到抛出错误为止(但该错误会被忽略,因为这通常表示父目录不是空目录)。例如,os.removedirs('foo/bar/baz') 将首先删除目录 'foo/bar/baz',然后如果 'foo/bar' 和 'foo' 为空,则继续删除它们。如果无法成功删除末尾一级目录,则抛出 OSError 异常。

引发一个 审计事件 os.remove,附带参数 path、dir_fd。

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)

将文件或目录 src 重命名为 dst。如果 dst 已存在,则下列情况下将会操作失败,并抛出 OSError 的子类:

在 Windows 上,如果 dst 已存在,则抛出 FileExistsError 异常。

在 Unix 上,如果 src 是文件而 dst 是目录,将抛出 IsADirectoryError 异常,反之则抛出 NotADirectoryError 异常。如果两者都是目录且 dst 为空,则 dst 将被静默替换。如果 dst 是非空目录,则抛出 OSError 异常。如果两者都是文件,则在用户具有权限的情况下,将对 dst 进行静默替换。如果 src 和 dst 在不同的文件系统上,则本操作在某些 Unix 分支上可能会失败。如果成功,重命名操作将是一个原子操作(这是 POSIX 的要求)。

本函数支持将 src_dir_fd 和 dst_dir_fd 中的一个或两个指定为 基于目录描述符的相对路径。

如果需要在不同平台上都能替换目标,请使用 replace()。

引发一个 审计事件 os.rename 附带参数 src、dst、src_dir_fd、dst_dir_fd。

os.renames(old, new)

递归重命名目录或文件。工作方式类似 rename(),除了会首先创建新路径所需的中间目录。重命名后,将调用 removedirs() 删除旧路径中不需要的目录。

注解 如果用户没有权限删除末级的目录或文件,则本函数可能会无法建立新的目录结构。

引发一个 审计事件 os.rename 附带参数 src、dst、src_dir_fd、dst_dir_fd。

os.replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None)

将文件或目录 src 重命名为 dst。如果 dst 是非空目录,将抛出 OSError 异常。如果 dst 已存在且为文件,则在用户具有权限的情况下,将对其进行静默替换。如果 src 和 dst 在不同的文件系统上,本操作可能会失败。如果成功,重命名操作将是一个原子操作(这是 POSIX 的要求)。

本函数支持将 src_dir_fd 和 dst_dir_fd 中的一个或两个指定为 基于目录描述符的相对路径。

引发一个 审计事件 os.rename 附带参数 src、dst、src_dir_fd、dst_dir_fd。  

os.rmdir(path, *, dir_fd=None)

移除(删除)目录 path。如果目录不存在或不为空,则会分别抛出 FileNotFoundError 或 OSError 异常。要删除整个目录树,可以使用 shutil.rmtree()。

本函数支持 基于目录描述符的相对路径。

引发一个 审计事件 os.rmdir,附带参数 path、dir_fd。

stat(path, *, dir_fd=None, follow_symlinks=True)

获取文件或文件描述符的状态。在所给路径上执行等效于 stat() 系统调用的操作。path 可以是字符串类型,或(直接传入或通过 PathLike 接口间接传入的) bytes 类型,或打开的文件描述符。返回一个 stat_result 对象。

本函数默认会跟踪符号链接,要获取符号链接本身的 stat,请添加 follow_symlinks=False 参数,或使用 lstat()。

本函数支持 指定文件描述符为参数 和 不跟踪符号链接。