FileNotFoundError:[Errno 2]在Python中使用os.unlink没有此类文件或目录

时间:2019-02-25 00:13:45

标签: python python-3.x

脚本的想法是让用户输入一个文件夹作为命令行参数,并使代码标识要删除的扩展名。当我进行测试运行并仅打印将被删除的文件和文件夹时,它可以完美地工作,但是当我运行脚本而没有注释掉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文件肯定存在。

1 个答案:

答案 0 :(得分:0)

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)