首页 > 解决方案 > FileNotFoundError:[Errno 2] 在 Python 中没有使用 os.unlink 的此类文件或目录

问题描述

该脚本的想法是让用户输入一个文件夹作为命令行参数,并让代码识别要删除的扩展名。当我进行测试运行并仅打印将被删除的文件和文件夹时,它工作得很好,但是当我运行脚本时没有取消注释 os.unlink 部分,我得到 FileNotFoundError ...

#! usr/bin/python3

import os
import sys


def clean(path):
    extensions = (".txt", ".jpg", ".jpeg", ".nfo", ".png", ".bmp")

    for root, dirs, files in os.walk(path):
        for file in files:
            if file.endswith(extensions):
                os.unlink(file)
                # print('Removing File:', os.path.join(root, file))

    for directories, names, files in os.walk(path):
        if os.listdir(directories):
            os.unlink(directories)
            # print('Removing Directory:', directories)


if __name__ == "__main__":
    filthy = sys.argv[1]
    clean(filthy)

错误信息:

Traceback (most recent call last):
  File "/home/a5pire/source/repos/plex/mediaClean/mediaClean.py", line 24, in <module>
    clean(filthy)
  File "/home/a5pire/source/repos/plex/mediaClean/mediaClean.py", line 13, in clean
    os.unlink(file)
FileNotFoundError: [Errno 2] No such file or directory: 'stuff.txt'

stuff.txt 文件肯定存在。

标签: pythonpython-3.x

解决方案


生成的files列表os.walk仅包含文件名。您应该将存储的路径名root与文件名连接起来,以便您拥有要传递给的完整路径名os.unlink

os.unlink(os.path.join(root, file))

此外,如果你打算删除空目录,你应该做if not os.listdir(directories):而不是if os.listdir(directories):,但由于你已经在使用os.walk,它返回子目录列表作为生成的元组中的第二项,你应该简单地使用它,并使用topdown=False参数确保子目录在其父目录之前被删除:

for directories, names, files in os.walk(path, topdown=False):
    if not names:
        os.rmdir(directories)

推荐阅读