rm -rf在Python中做等效的最简单方法是什么?
1
如何使用Python删除/删除不为空的文件夹的
—
Trevor Boyd Smith,
rm -rf在Python中做等效的最简单方法是什么?
Answers:
import shutil
shutil.rmtree("dir-you-want-to-remove")
rm -rf non-existing-folder可以正常工作(它什么也不做),但是您的脚本会失败
虽然有用,但rmtree不是等效的:如果您尝试删除单个文件,则rmtree会出错,但rm -f不会删除(请参见下面的示例)。
要解决此问题,您需要检查您的路径是文件还是目录,并采取相应措施。这样的事情应该可以解决问题:
import os
import shutil
def rm_r(path):
if os.path.isdir(path) and not os.path.islink(path):
shutil.rmtree(path)
elif os.path.exists(path):
os.remove(path)
注意:此功能将不处理字符或块设备(需要使用stat模块)。
rm -f与Python的区别示例shutils.rmtree
$ mkdir rmtest
$ cd rmtest/
$ echo "stuff" > myfile
$ ls
myfile
$ rm -rf myfile
$ ls
$ echo "stuff" > myfile
$ ls
myfile
$ python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import shutil
>>> shutil.rmtree('myfile')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/shutil.py", line 236, in rmtree
onerror(os.listdir, path, sys.exc_info())
File "/usr/lib/python2.7/shutil.py", line 234, in rmtree
names = os.listdir(path)
OSError: [Errno 20] Not a directory: 'myfile'
编辑:处理符号链接;注意@pevik评论的限制
True ,此版本os.path.isdir(symlink_to_directory)
os.remove删除设备就好了;我刚试过 我不了解有关代码不适用于设备文件等的评论。POSIX syscallunlink不能区分文件和设备。
import os
import shutil
def rm_r(path):
if not os.path.exists(path):
return
if os.path.isfile(path) or os.path.islink(path):
os.unlink(path)
else:
shutil.rmtree(path)
略微改进了Gabriel Grant的版本。这也适用于目录的符号链接。注意:函数不能处理Un * x字符并阻止设备(这需要使用stat模块)。
unlink放到后备案例中来处理设备。rmtree如果检测到目录,该怎么办。也就是说,我们不必专门测试设备节点类型。
Windows阻止文件删除的一种解决方法是截断文件:
outputFile = open(r"filename.txt","w")
outputFile.truncate()
outputFile.close()
outputFile = open(r"filename.txt","a+")
def delite(filepath):
import os, stat, sys
def intertwin(_list):
list1 = []
for i in _list:
list1 += i
return list1
allpath = os.walk(filepath)
walk = []
dirs = []
path = []
allfiles = []
for i in allpath:
walk.append(i)
for i in walk:
dirs.append(i[0])
for _dir in dirs:
os.chdir(_dir)
files = os.listdir(_dir)
files1 = []
for i in files:
files1.append(_dir + '\\' + i)
files = files1[:]
allfiles.append(files)
allfiles = intertwin(allfiles)
for i in allfiles:
os.chmod(i, stat.S_IRWXU)
allfiles.reverse()
os.chdir(sys.path[0])
for i in allfiles:
try:
os.remove(i)
except:
try:
os.rmdir(i)
except:
pass
os.chmod(filepath, stat.S_IRWXU)
try:
os.remove(filepath)
except:
os.rmdir(filepath)
allfiles.reverse()
os.chdir(sys.path[0])
for i in allfiles:
try:
os.remove(i)
except:
try:
os.rmdir(i)
except:
pass
os.chmod(filepath, stat.S_IRWXU)
try:
os.remove(filepath)
except:
os.rmdir(filepath)
只是这样做:
import os
dirname = "path_to_directory_to_remove"
os.system("rm -rf %s" % dirname)