python - 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 文件肯定存在。
解决方案
生成的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)
推荐阅读
- tsql - IF 条件返回太多值
- python - 使用多线程从请求中提取 Gzip 文件
- reactjs - 使用 MSAL React 调用 API
- php - laravel eloquent 中复杂的条件关系用于多态性
- docker - 改善 Docker 映像的 ECS 任务拉取时间的延迟?
- docker - $CI_COMMIT_TAG 在常规工作的“if”状态中
- angular - 我应该在组件销毁上完成 BehaviorSubject – Angular2
- java - 如何在java中使用正则表达式为elasticsearch创建多匹配查询?
- c# - get postback control 和 RegisterStartupScript 之间的奇怪冲突
- python - Scape gtag/jquery 变量与 BeautifulSoup?