概述
注意:如果有人投了我的反对票,我有一些事情要解释。
每个人都喜欢简短的回答。然而,有时候现实并不那么简单。
回到我的答案。我知道
shutil.rmtree()
可用于删除目录树。我在自己的项目中使用过很多次。但你必须意识到
目录本身也将被删除
SUTIL.RTERE()
. 虽然这可能对某些人来说是可以接受的,但这不是一个有效的答案
删除文件夹的内容(无副作用)
.
我给你举个副作用的例子。假设您有一个目录
定制的
所有者和模式位,其中有很多内容。然后用删除它
SUTIL.RTERE()
然后用
os.mkdir()
. 你会得到一个空目录
违约
(继承)所有者和模式位。虽然您可能有删除内容甚至目录的特权,但是您可能无法在目录上设置原始所有者和模式位(例如,您不是超级用户)。
最后,
耐心地阅读代码
. 它长而难看(在视线中),但被证明是可靠和有效的(在使用中)。
这是一个长而难看,但可靠和有效的解决方案。
它解决了一些其他回答者没有解决的问题:
它正确处理符号链接,包括不调用
SUTIL.RTERE()
在符号链接上(将通过
os.path.isdir()
测试它是否链接到一个目录;甚至是
os.walk()
也包含符号链接目录)。
它可以很好地处理只读文件。
这是代码(唯一有用的功能是
clear_dir()
):
import os
import stat
import shutil
# http://stackoverflow.com/questions/1889597/deleting-directory-in-python
def _remove_readonly(fn, path_, excinfo):
# Handle read-only files and directories
if fn is os.rmdir:
os.chmod(path_, stat.S_IWRITE)
os.rmdir(path_)
elif fn is os.remove:
os.lchmod(path_, stat.S_IWRITE)
os.remove(path_)
def force_remove_file_or_symlink(path_):
try:
os.remove(path_)
except OSError:
os.lchmod(path_, stat.S_IWRITE)
os.remove(path_)
# Code from shutil.rmtree()
def is_regular_dir(path_):
try:
mode = os.lstat(path_).st_mode
except os.error:
mode = 0
return stat.S_ISDIR(mode)
def clear_dir(path_):
if is_regular_dir(path_):
# Given path is a directory, clear its content
for name in os.listdir(path_):
fullpath = os.path.join(path_, name)
if is_regular_dir(fullpath):
shutil.rmtree(fullpath, οnerrοr=_remove_readonly)
else:
force_remove_file_or_symlink(fullpath)
else:
# Given path is a file or a symlink.
# Raise an exception here to avoid accidentally clearing the content
# of a symbolic linked directory.
raise OSError("Cannot call clear_dir() on a symbolic link")
最后
以上就是勤劳汽车为你收集整理的python代码如何删除_如何删除python中文件夹的内容?的全部内容,希望文章能够帮你解决python代码如何删除_如何删除python中文件夹的内容?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复