Python学习:纠错笔记:详解os.removedirs(path)的正确用法

第一次写博客


遇到os模块里的os.removedirs(path),有点摸不着头脑,它的名字和大部分教程网站上都告诉我们,它的作用是遍历删除一个目录下的多个目录(多个非空目录),听起来好像这样:

系统原来的目录:

Window F:\盘的目录如下:



F:

\ a, a.txt                                                      (代表F 目录下有一个文件夹a,和一个名为a.txt的文本文件 )

\ b, b.txt                                                      (代表a 目录下有一个文件夹b,和一个名为b.txt的文本文件 )

\ c, c,txt                                                      (代表b 目录下有一个文件夹c,和一个名为c.txt的文本文件 )


调用os.removedirs(r'F:\a\b') 后就会删除b文件夹和嵌套在b文件夹中的子文件夹和文件,但是实验之后发现,不但无法达到删除目的,而且会报错终止。我们从错误信息中找信息,发现它是在调用redir()时出错的。


查看官方文档,才明白:

os.removedirs(path)Remove directories recursively. Works like rmdir() except that, if the leaf directory is successfully removed, removedirs() tries to successively remove every parent directory mentioned in path until an error is raised (which is ignored, because it generally means that a parent directory is not empty). For example, os.removedirs('foo/bar/baz') will first remove the directory 'foo/bar/baz', and then remove 'foo/bar' and 'foo' if they are empty. Raises OSError if the leaf directory could not be successfully removed.


原来,os.removedirs()遍历删除多个文件夹不假,但是,它适用的情景很特殊:

他的工作方式像rmdir()一样,它删除多个文件夹的方式是通过在目录上由深及浅逐层调用rmdir()函数实现的,在确定最深的目录为空目录时(因为rmdir只能移除空目录),调用rmdir()函数,移除该目录,工作对象上移一层目录,如果上次的移除动作完毕后当前目录也变成了空目录,那么移除当前目录。重复此动作,直到遇到一个非空目录为止。

例如:

F:

\ a                                                        (代表F 目录下有一个文件夹a )

\ b, b.txt                                               (代表a 目录下有一个文件夹b 和 一个文本文件b.txt)

\ c                                                       (代表b 目录下有一个文件夹c )

\ d                                                       (代表c 目录下有一个文件夹d)

\ e                                                       (代表d 目录下有一个文件夹e )

\ f                                                        (代表e  目录下有一个文件夹f )


你看,a目录下包含一个b目录和一个文件, b目录以下就是空目录套空目录了

如果我们执行


os.removedirs(r'F:\a\b\c\d\e\f'


那么在函数的内部:

它依次删除了目录f, e, d, c,b 。每次删除一个目录时,被删除的目录都是个空目录。删除动作直到遇到一个非空目录a后才停下了。(因为目录a内还有文件b.txt)

所以结果为:


F:

\ a                                                        (代表F 目录下有一个文件夹a )

\ b

至于文章开通的例子为什么会报错,答案已经公布了,因为:该函数的工作方式像rmdir()一样,它删除多个文件夹的方式是通过在目录上由深及浅逐层调用rmdir()函数实现的。如果最深层的目录根本就不是空目录,所以会报错终止。






  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
出现 "TypeError: expected str, bytes or os.PathLike object, not NoneType" 错误是因为 `path` 变量的值为 `None`,而 `os.fspath()` 函数期望接收一个字符串、字节或 `os.PathLike` 对象作为参数。 要解决这个问题,你可以检查 `path` 变量的来源和赋值过程,确保它被正确地赋值为一个有效的文件路径。以下是一些可能导致此错误的常见原因和解决方法: 1. 检查文件的存在和路径:确保在使用 `os.fspath()` 之前,`path` 变量是有效的文件路径。你可以使用 `print()` 语句或调试器来检查变量的值。确保文件存在,并且路径是正确的。 2. 检查文件是否成功上传:如果 `path` 是由文件上传操作获得的,确保文件上传成功,并且在服务器端能够正确地接收到文件。你可以通过打印或记录上传操作的结果来检查是否成功。 3. 处理可能的异常情况:如果 `path` 的值可能为 `None`,你应该在使用它之前进行适当的异常处理。例如,使用条件语句检查 `path` 是否为 `None`,然后根据需要执行相应的处理逻辑。 以下是一个示例代码,演示了如何处理可能的异常情况: ```python import os # 检查 path 是否为 None if path is None: # 处理 path 为 None 的情况 # 例如,抛出一个异常或执行其他逻辑 raise ValueError("Invalid path: path is None") else: # 对于非 None 的 path,继续使用它 path = os.fspath(path) ``` 通过添加适当的异常处理逻辑,你可以避免出现 "TypeError: expected str, bytes or os.PathLike object, not NoneType" 错误。 希望这些解决方法能帮助你解决问题!如果还有其他疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值