在本教程中,您将精通 Python 目录的所有知识,了解 OS 模块在 Python 中的重要性,以及如何通过示例创建、更改、重命名和删除目录。
目录是一个简单的文件夹,其中包含文件和子目录的集合,而子目录又可以包含子目录和文件。在计算机系统中,目录用于以结构良好的方式组织文件。要获取文件中的内容或文件本身,Python 需要与操作系统进行交互,因此 Python 允许将 OS 模块导入到特定程序中。
Python 中的 OS 模块属于标准实用模块,它支持与操作系统相关的功能。os 模块提供了一些功能,有助于操作文件和目录。
在我们之前的教程中,我们学习了如何导入模块。让我们先回顾一下。
import os
要获取此模块中的方法,请使用以下语法
import os
print(dir(os))
输出将是 OS 模块中使用的所有方法的列表,如下所示
['DirEntry', 'F_OK', 'MutableMapping', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXCL', 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LIVED', 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'P_DETACH', 'P_NOWAIT', 'P_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'PathLike', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'TMP_MAX', 'W_OK', 'X_OK', '_AddedDllDirectory', '_Environ', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_check_methods', '_execvpe', '_exists', '_exit', '_fspath', '_get_exports_list', '_putenv', '_unsetenv', '_wrap_close', 'abc', 'abort', 'access', 'add_dll_directory', 'altsep', 'chdir', 'chmod', 'close', 'closerange', 'cpu_count', 'curdir', 'defpath', 'device_encoding', 'devnull', 'dup', 'dup2', 'environ', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fdopen', 'fsdecode', 'fsencode', 'fspath', 'fstat', 'fsync', 'ftruncate', 'get_exec_path', 'get_handle_inheritable', 'get_inheritable', 'get_terminal_size', 'getcwd', 'getcwdb', 'getenv', 'getlogin', 'getpid', 'getppid', 'isatty', 'kill', 'linesep', 'link', 'listdir', 'lseek', 'lstat', 'makedirs', 'mkdir', 'name', 'open', 'pardir', 'path', 'pathsep', 'pipe', 'popen', 'putenv', 'read', 'readlink', 'remove', 'removedirs', 'rename', 'renames', 'replace', 'rmdir', 'scandir', 'sep', 'set_handle_inheritable', 'set_inheritable', 'spawnl', 'spawnle', 'spawnv', 'spawnve', 'st', 'startfile', 'stat', 'stat_result', 'statvfs_result', 'strerror', 'supports_bytes_environ', 'supports_dir_fd', 'supports_effective_ids', 'supports_fd', 'supports_follow_symlinks', 'symlink', 'sys', 'system', 'terminal_size', 'times', 'times_result', 'truncate', 'umask', 'uname_result', 'unlink', 'urandom', 'utime', 'waitpid', 'walk', 'write']
现在,如果您想知道当前正在工作的目录的路径,可以使用 getcwd() **方法。**
import os
os.getcwd()
'C:\\Users\\AppData\\Local\\Programs\\Python\\Python38-32'
getcwd() 方法以字符串形式返回 Python 中当前工作目录的路径,如示例所示。您还可以使用 type() 方法检查结果的类型。
import os
type(os.getcwd())
仔细查看 getcwd() 的输出,我们可以看到路径中使用两个反斜杠(\\)来分隔路径组件。额外的反斜杠充当后续字符串的转义字符。我们可以使用 print 函数将其删除,相同的路径将更改为如下所示
import os
print(os.getcwd())
C:\Users\AppData\Local\Programs\Python\Python38-32
如果您想将当前工作目录的路径作为字节对象获取,只需在 getcwd() 方法后附加 'b',即使用 getcwdb() 方法。
import os
os.getcwdb()
b'C:\\Users\\AppData\\Local\\Programs\\Python\\Python38-32'
要更改当前工作目录,我们可以使用内置方法 chdir()。新路径应作为参数传递。反斜杠(\\)和正斜杠(//)都可以接受,用于分隔路径中的元素。
import os
os.chdir('C:\\Users\\Desktop')
现在工作目录已从 python 文件夹更改为 Desktop。您可以通过简单地列出目录中的元素来检查目录的变化。
我们可以使用 listdir() 方法列出目录或文件中的元素。如果您没有传递参数,它将提供当前目录中的所有元素。返回的是一个列表,其中包含指定目录中的所有目录或文件。在这里,在本例中,桌面上所有的文件夹和文件都显示为一个列表。
请看以下示例
import os
os.chdir('C:\\Users\\Desktop')
os.listdir()
输出将是
['desktop.ini', 'EMAIL TEMPLATES.docx', ' 'New Microsoft Excel Worksheet.xlsx', 'New Microsoft Word Document (2).docx', 'New Microsoft Word Document.docx', 'notepad.py', 'PY PRO']
要创建目录,我们使用内置方法 mkdir()。我们应该将目录的路径作为其参数。
import os
os.mkdir('C:\\Users\\Desktop\\Directory_1')
输出

如果您尝试创建一个系统中已存在的目录,您将收到一个错误,指出 FileExistsError ,如下所示。
import os
os.mkdir('C:\\Users\\Desktop\\PY PRO')
输出
Traceback (most recent call last): File "", line 1, in os.mkdir('C:\\Users\\Desktop\\PY PRO') FileExistsError: [WinError 183] Cannot create a file when that file
只需查看 listdir() 的输出,您就可以看到“PY PRO”文件夹已存在于系统中。
Python 还有一个名为 makedirs() 的内置方法,用于创建嵌套结构的目录。换句话说,makedirs() 方法会递归创建目录,如下面的示例所示。
import os
os.makedirs('PYTHON/DataTypes/int')
os.makedirs('C/DataTypes/float')
os.makedirs('Java/DataTypes/float')
os.listdir()
输出
['C', 'JAVA', 'PYTHON']
即使找不到第一级文件夹或目录,此操作也会在目录中创建路径。它会按照我们指定的顺序嵌套文件。在此示例中,0 级文件夹是 **Directory_1**,在 1 级创建了一个名为 PYTHON 的文件夹,该文件夹又在 2 级创建了另一个名为 DataTypes 的文件夹,在 3 级包含 int 文件夹。但在上面的 os.listdir() 中,只列出了特定级别的目录。
要列出目录的嵌套结构,我们可以使用 os.walk() 方法,该方法允许我们递归地遍历目录。os.walk() 方法利用 for 循环返回目录中的根目录、子目录和文件。以下示例打印 **Directory_1** 中的所有子目录和文件。
import os
rootdir='C:\\Users\\TP-E540\\Desktop\\Programming Languages'
for roots,dirs,files in os.walk(rootdir):
print("{0} has {1} files".format(roots, len(files)))
输出
Output: C:\Users\Desktop\Programming Languages has 8 files C:\Users\Desktop\Programming Languages\C has 2 files C:\Users\Desktop\Programming Languages\JAVA has 2 files C:\Users\Desktop\Programming Languages\PYTHON has 2 files C:\Users\Desktop\Programming Languages\PYTHON\DataTypes has 1 files C:\Users\Desktop\Programming Languages\PYTHON\DataTypes\float has 1 file
假设您想重命名一个目录,那么您可以使用 os 模块中提供的 **rename(source,destination)** 方法。此 **rename()** 方法需要两个参数:
Source_name:表示要更改的名称
Destination_name:表示新名称
import os
os.rename('Directory_1','Programming Languages')
输出

在示例中,最初文件夹的名称是 Directory_1,已重命名为 Programming Languages。
当源目录“Directory_1”在系统中不可用时,系统将引发名为 FileNotFoundError 的异常。同样,当目标“Programming Languages”已存在于系统中时,也会引发 FileExistsError 异常。
我们可以使用 rmdir() 方法从系统中删除目录,其中传递的参数是目录的路径。
import os
os.rmdir('C:\\Users\\Desktop\\IMAGES')
此示例表示删除名为 IMAGES 的空文件夹或目录。该文件夹将从系统中删除。
如果我们再次尝试删除已删除的文件夹或系统中不存在的文件夹会怎样?请观察以下示例。
import os
os.rmdir('C:\\Users\\Desktop\\IMAGES')
输出
Traceback (most recent call last): File "", line 1, in os.rmdir('C:\\Users\\Desktop\\IMAGES') FileNotFoundError: [WinError 2] The system cannot find the file specified: 'C:\\Users\\Desktop\\IMAGES'
显然,由于文件在系统中不可用,将引发 FileNotFoundError **。**
考虑我们尝试删除一个非空目录的情况,即包含子文件夹或文件的目录。解释器将引发一个 OSError**,** 如下所示。
import os
os.rmdir('C:\\Users\\Desktop\\Programming Languages')
输出
Traceback (most recent call last): File "", line 1, in os.rmdir('C:\\Users\\Desktop\\Programming Languages') OSError: [WinError 145] The directory is not empty: 'C:\\Users\Desktop\\Programming Languages'
到目前为止,我们已经讨论了如何在单个平台上操作目录或文件。为了使我们的程序与平台无关,我们必须使用平台无关的目录或文件路径。这可以通过使用子模块 **os.path** 来实现。
与 **os.path** 子模块相关的两个重要方法是:
>>> import os
>>> os.path.join('C:','Users','Desktop','Programming Languages')
>>> import os
>>> os.path.split('C:\\Users\\Desktop\\Programming Languages')
('C:\\Users\\Desktop', 'Programming Languages')
也可以检查路径在系统中的存在性。要检查目录是否存在于系统中,我们可以使用 exists() 函数或 isdir() 函数。这两个函数都位于子模块 **os.path** 中。以下示例显示了 exists() 函数如何检查路径的存在性。
>>> import os
>>> os.path.exists('C:\\Users\\TP-E540\\Desktop\\Programming Languages')
True
>>> os.path.exists('C:\\Users\\TP-E540\\Desktop\\File.txt')
True
>>> os.path.exists('C:\\Users\\TP-E540\\Desktop\\New')
False
isdir() 函数检查目录路径的存在性,而不是文件路径。以下示例将对此进行说明。
>>> import os
>>> os.path.isdir('C:\\Users\\TP-E540\\Desktop\\Programming Languages')
True
>>> os.path.isdir('C:\\Users\\TP-E540\\Desktop\\New.txt')
False
>>> os.path.isdir('C:\\Users\\TP-E540\\Desktop\\New dir')
False
因此,我们可以总结 exists() 函数检查路径是否存在。而 isdir() 函数检查目录路径是否存在。