ZetCode

Python 目录

最后修改于 2024 年 1 月 29 日

Python 目录教程展示了如何在 Python 中操作目录。我们演示了如何在 Python 中创建、重命名、移动或列出目录。

目录定义

目录是计算机文件系统中用于存储和定位文件的组织单元。目录被分层组织成一个目录树。目录具有父子关系。目录有时也称为文件夹。

Python 中有多种用于操作目录的函数。它们位于 ospathlib 模块中。在本教程中,我们使用 pathlib 模块,它具有更现代的 API。

Python 创建目录

Path.mkdir 可以创建单个目录或多个目录,包括中间目录。

如果目录已存在,则会引发 FileExistsError

create_dir.py
#!/usr/bin/python

from pathlib import Path

p = Path('test')
p.mkdir()

此示例使用 Pathmkdir 函数创建目录。

$ ./create_dir.py 
$ ./create_dir.py 
Traceback (most recent call last):
    File "./create_dir.py", line 6, in <module>
    p.mkdir()
    File "/usr/lib/python3.8/pathlib.py", line 1284, in mkdir
    self._accessor.mkdir(self, mode)
FileExistsError: [Errno 17] File exists: 'test'

当我们运行程序两次时,会抛出异常。为了解决这个问题,我们可以检查目录是否已经存在。

create_dir2.py
#!/usr/bin/python

from pathlib import Path

dir_name = 'test'

p = Path(dir_name)

try:
    if not p.exists():
        p.mkdir()
except OSError:
    print(f'Error: Creating directory. {dir_name}')

在创建目录之前,我们使用 Path.exists 函数检查它是否已存在。我们还捕获了可能的异常。

另一种解决方案是使用 exist_ok 标志。如果将此标志设置为 True,则会忽略 FileExistsError 异常。

create_dir3.py
#!/usr/bin/python

from pathlib import Path

dir_name = 'test'

p = Path(dir_name)
p.mkdir(exist_ok=True)

在此示例中,我们忽略了 FileExistsError 异常。

Python 创建临时目录

tempfile.TemporaryDirectory 函数可以安全地创建临时目录。在上下文完成或临时目录对象被销毁时,新创建的临时目录及其所有内容都会从文件系统中删除。

create_temp_dir.py
#!/usr/bin/python

import tempfile

with tempfile.TemporaryDirectory() as tempdir:
     print(f'created temporary directory {tempdir}')

此示例创建了一个临时目录。当程序结束时,该目录将被销毁。

$ ./create_temp_dir.py 
created temporary directory /tmp/tmpww4breow

程序在特殊的 /tmp 目录中创建了一个临时目录,该目录在 Linux 上用于此类目的。

Python 重命名目录

Path.rename 函数用于重命名目录。

rename_dir.py
#!/usr/bin/python

from pathlib import Path

src = 'test'
dest = 'test2'

p = Path(src)
p.rename(dest)

在此示例中,我们将 test 目录重命名为 test2

Python 删除目录

目录使用 Path.rmdir 函数删除。目录必须为空。

remove_dir.py
#!/usr/bin/python

from pathlib import Path

p = Path('test2')
p.rmdir()

此示例删除了 test2 目录。

Python 移动目录

shutil.move 函数用于移动目录。

shutil.move(src, dst, copy_function=copy2)

shutil.move 将文件或目录(src)递归地移动到另一个位置(dst)并返回目标。

有两个复制函数:copycopy2;默认是 copy2。它们在处理文件元数据方面有所不同。copy2 尝试保留所有文件元数据,而 copy 则不。

move_dir.py
#!/usr/bin/python

import shutil

src = 'docs'
dst = 'docs2'

shutil.move(src, dst)

此示例将 doc 目录的内容移动到 docs2

$ mkdir docs
$ touch docs/data.txt docs/names.csv docs/numbers.csv

我们创建了 docs 目录和一些文件。

$ ./move_dir.py 
$ ls docs2/
data.txt  names.csv  numbers.csv

我们运行程序并显示新目录的内容。

Python 当前工作目录

Path.cwd 函数返回一个表示当前目录的新路径对象。

current_dir.py
#!/usr/bin/python

from pathlib import Path
from os import chdir

path = Path('..')

print(f'Current working directory: {path.cwd()}')

chdir(path)

print(f'Current working directory: {path.cwd()}')

chdir('..')

此示例更改目录并打印当前目录。

Python 主目录

Path.home 函数返回一个表示用户主目录的新路径对象。

home_dir.py
#!/usr/bin/python

from pathlib import Path
home = str(Path.home())
print(home)

程序打印启动它的用户的家目录。

Python 目录父级

Path.parent 返回路径的父目录,而 Path.parents 返回路径的祖先序列。

parents.py
#!/usr/bin/python

from pathlib import Path

path = Path.cwd()

print(f'The parent directory of {path} is {path.parent}')
print(f'The parent of the parent of {path} is {path.parent.parent}')

print(f'All the parents of {path.parent}: ')

print(list(path.parents))

此示例打印当前工作目录的各个父目录。

Python 列出目录内容

Path.iterdir 产生目录内容的路径对象。子项以任意顺序产生,并且不包含特殊条目 '.' 和 '..'。

list_dir.py
#!/usr/bin/python

from pathlib import Path

path = Path('.')

dirs = [e for e in path.iterdir()]

for mydir in dirs:
    print(mydir)

此示例列出了当前工作目录的文件和目录。列表是非递归的。

Python 检查路径是否为目录

如果路径指向一个目录,Path.is_dir 返回 True

list_dirs.py
#!/usr/bin/python

from pathlib import Path

path = Path('.')

dirs = [e for e in path.iterdir() if e.is_dir()]
print(*dirs)

在此示例中,我们列出了当前工作目录的所有直接子目录。

$ ./list_dirs.py 
mydata docs2 listdirectory

在我们的例子中,我们有三个子目录。

Python 递归列出目录

path.rglob 递归地生成所有匹配给定简单模式的文件。

recursive.py
#!/usr/bin/python

from pathlib import Path

path = Path('..')

for e in path.rglob('*.py'):
    print(e)

在此示例中,我们递归地遍历父目录的内容并打印所有 Python 文件。

来源

Python 文件和目录访问 - 语言参考

在本文中,我们学习了如何在 Python 中操作目录。

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有超过十年的经验。

列出所有 Python 教程