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