跳至主要内容

如何在 Python 中获取当前目录

要在 Python 中获取当前工作目录,您可以使用 os 模块中的 os.getcwd(),或 pathlib 模块中的 pathlib.Path.cwd()。

使用 AI 探索

许多 Python 程序需要在文件系统中导航以读写文件。一个常见操作是获取当前工作目录,通常缩写为CWD。

Python 有两个主要模块可用于访问文件系统路径: os 模块和 pathlib 模块。

os 模块提供了获取当前工作目录的传统方法,并可用于处理路径和文件系统。

pathlib 是一个较新的模块,提供面向对象的方法,健壮且跨平台。

在本教程中,我将探讨获取和操作当前工作目录的各种技巧。如果您想进一步学习 Python,欢迎阅读我的其他博文:

Python:如何获取当前工作目录(CWD)

当前工作目录是执行 Python 程序的目录。它作为相对文件路径的参考点,使程序能够访问目录层级中的文件和资源。

接下来我们看如何使用 os 和 pathlib 模块访问当前工作目录,并比较这两种方案。

使用 os.getcwd()

os 模块允许访问计算机的操作系统。getcwd() 函数可获取当前工作目录:

import os
cwd = os.getcwd()
print(cwd)
/Users/sg/Documents/GitHub/datacamp

输出显示了包含脚本的目录路径。路径格式取决于操作系统。上述输出适用于 Linux、Unix 和 macOS 等 POSIX 操作系统。

在 Windows 系统上,相同路径将显示为:

C:\Users\sg\Documents\GitHub\datacamp

os.getcwd() 返回的值是一个字符串:

print(type(cwd))
<class 'str'>

因此,我们需要使用字符串方法和其他字符串操作来处理该路径。

使用 pathlib.Path.cwd()

Python 3.4 引入了 pathlib 模块,它提供了面向对象的文件路径访问与操作方法。pathlib 中的主要类是 Path,我们可以先导入它再获取当前工作目录:

from pathlib import Path
cwd = Path.cwd()
print(cwd)
/Users/sg/Documents/GitHub/datacamp

Path.cwd() 的打印输出看起来与 os.getcwd() 返回的值相似。然而,Path.cwd() 并不返回字符串。我们可以通过打印返回对象的类型,或使用 repr() 显示其正式字符串表示来确认:

print(type(cwd))
print(repr(cwd))
<class 'pathlib.PosixPath'>
PosixPath('/Users/sg/Documents/GitHub/datacamp')

在 Windows 计算机上,Path.cwd() 返回一个 WindowsPath 对象。

PosixPath 和 WindowsPath 对象提供相似的功能,以支持跨平台程序。下面是这些对象的一些属性:

print(cwd.parent)
print(cwd.name)
/Users/sg/Documents/GitHub
datacamp

在可能的情况下,优先使用更现代、且更易于处理路径的 pathlib 模块。如果您想了解更多,可以阅读这篇Python 中使用 pathlib 的综合指南。

使用当前目录进行操作

Python 程序经常需要操作路径,例如将文件保存到子文件夹。假设我们需要在当前工作目录中创建一个新的子目录,并在新文件夹中保存一个文本文件。

使用 os 模块

os 模块中的 getcwd() 函数返回一个字符串。因此,可以手动修改该字符串来变更路径。不过,由于不同系统的路径格式不同,所需的修改也不同。更好的做法是使用 os.path.join():

import os
cwd = os.getcwd()
output_path = os.path.join(cwd, "testing_os")
print(output_path)
/Users/sg/Documents/GitHub/datacamp/testing_os

os.path.join() 返回的路径会根据所用操作系统采用正确的格式。它返回包含新路径的字符串。我们可以使用 os.path.exists() 检查该子文件夹是否存在,它会返回布尔值:

print(os.path.exists(output_path))
False

这表明由 output_path 表示的路径尚不存在。os 模块提供了创建该文件夹的工具。函数 os.mkdir() 会新建一个目录:

os.mkdir(output_path)
print(os.path.exists(output_path))
True

新的子文件夹现在已经存在,可以在该文件夹中保存新文件:

output_file = os.path.join(output_path, "test.txt")
with open(output_file, "w") as file:
    file.write("Testing path modification with the 'os' module")

变量 output_file 包含所需输出文件的完整路径及文件名。该文本文件会被创建在当前工作目录下的 /testing_os 子文件夹中。

我们还可以使用 os.listdir() 列出文件夹中的所有项目:

for item in os.listdir(output_path):
    print(item)
test.txt

函数 os.listdir() 返回该目录中所有项目的列表。上述代码遍历该列表,将每个文件或文件夹单独一行显示。在这个示例中,目录只包含一个文本文件。

使用 pathlib 模块

较新的 pathlib 模块也提供创建新路径的工具。该模块使用正斜杠运算符 / 将各个元素组合成路径。这个运算符与数值类型的除法运算符相同,同时也是 POSIX 操作系统中文件路径使用的字符。我们来创建一个新路径,并检查它是否已存在:

from pathlib import Path
cwd = Path.cwd()
output_path = cwd / "testing_pathlib"
print(output_path)
print(Path.exists(output_path))
/Users/sg/Documents/GitHub/datacamp/testing_pathlib
False

Path 类有自己的 .mkdir() 方法用于创建新目录:

Path.mkdir(output_path)
print(Path.exists(output_path))
True

由于 output_path 是一个 PosixPath 或 WindowsPath 对象,我们可以在任意位置使用正斜杠运算符创建新路径:

with open(output_path / "test.txt", "w") as file:
    file.write("Testing path modification with the 'pathlib' module")

新的文本文件已创建在 /testing_pathlib 文件夹中。

我们可以使用 Path 的 .iterdir() 方法遍历文件夹中的每个项目:

for item in Path.iterdir(output_path):
    print(item)
/Users/sg/Documents/GitHub/datacamp/testing_pathlib/test.txt

与 pathlib 中的其他工具一样,返回的值不是字符串,而是 PosixPath 或 WindowsPath 对象。我们可以使用 .name 属性仅显示不含完整路径的文件或文件夹名:

for item in Path.iterdir(output_path):
    print(item.name)
test.txt

与返回列表的 os.listdir() 不同,pathlib.Path.iterdir() 返回一个 generator 对象(如果您需要复习,可以阅读这篇关于Python 迭代器与生成器的教程):

print(Path.iterdir(cwd))
<generator object Path.iterdir at 0x1036b2c20>

这种行为符合现代 Python 的最佳实践,因为在某些情况下,迭代器和生成器更高效。

更改当前工作目录(CWD)

也可以在 Python 程序中直接使用 os.chdir() 更改当前工作目录。由于这不是与路径直接相关的操作,pathlib 中没有对应版本。不过,我们仍然可以将 pathlib.Path 对象作为参数传入:

import os
from pathlib import Path
cwd = Path.cwd()
print(cwd)

os.chdir(cwd.parent)
cwd = Path.cwd()
print(cwd)
/Users/sg/Documents/GitHub/datacamp
/Users/sg/Documents/GitHub

工作目录现在已经更改。我们也可以使用 cwd.parent.resolve() 以确保正确处理任何符号链接。传给 os.chdir() 的参数也可以是字符串,例如 os 模块中函数返回的路径。

在程序中更改工作目录时需要谨慎,以避免出现意外行为。

最佳实践与提示

以下是处理 Python 路径时的一些最佳实践与提示:

在 Python 中处理路径的最佳实践

结论

在许多 Python 程序中,导航和操作文件路径是常见需求。os 模块提供了处理这些任务的传统函数,而 pathlib 模块则提供了更现代、面向对象的方法。使用 pathlib 不仅能简化许多操作,还能确保代码跨平台且更易阅读。

无论您是在维护使用 os 的现有代码库,还是在启动一个可以充分利用 pathlib 的新项目,理解这两个模块及其功能都能让您在任何 Python 项目中从容管理路径。

继续您的 Python 学习之旅,看看这些课程:

Stephen Gruppetta

作者

Stephen Gruppetta

我在马耳他大学完成了本科阶段的物理与数学学习。随后前往伦敦,并在帝国理工学院取得物理学博士学位,研究用于成像人类视网膜的新型光学技术。现在,我专注于撰写与传播 Python 相关内容,并教授 Python。

主题