如何删除Python中的文件夹的内容?
我如何删除Python中的本地文件夹的内容?
目前的项目是为Windows,但我希望看到*尼克斯也。
更新为只删除文件并使用注释中build议的os.path.join()方法。 如果您还想删除子目录,请取消注释elif语句。
import os, shutil folder = '/path/to/folder' for the_file in os.listdir(folder): file_path = os.path.join(folder, the_file) try: if os.path.isfile(file_path): os.unlink(file_path) #elif os.path.isdir(file_path): shutil.rmtree(file_path) except Exception as e: print(e)
尝试shutil模块
import shutil shutil.rmtree('/path/to/folder')
描述:
shutil.rmtree(path, ignore_errors=False, onerror=None)
文档string:recursion地删除目录树。
如果设置了
ignore_errors
,则忽略错误; 否则,如果设置了onerror
,则会调用它来处理带有参数(func, path, exc_info)
的错误,其中func
是os.listdir
,os.remove
或os.rmdir
; path是导致它失败的那个函数的参数; 而exc_info
是由sys.exc_info()
返回的元组。 如果ignore_errors
为false并且onerror
为None
,则会引发exception。
你可以简单地做到这一点:
import os import glob files = glob.glob('/YOUR/PATH/*') for f in files: os.remove(f)
你可以在你的path中使用其他filter,例如:/YOU/PATH/*.txt,用于删除目录中的所有文本文件。
扩大mhawke的答案,这是我已经实施。 它删除文件夹的所有内容,但不删除文件夹本身。 在Linux上testing文件,文件夹和符号链接,也应该在Windows上工作。
import os import shutil for root, dirs, files in os.walk('/path/to/folder'): for f in files: os.unlink(os.path.join(root, f)) for d in dirs: shutil.rmtree(os.path.join(root, d))
使用rmtree
并重新创build文件夹可以工作,但是我删除并立即重新创buildnetworking驱动器上的文件夹时遇到错误。
build议的解决scheme使用walk不起作用,因为它使用rmtree
删除文件夹,然后可能会尝试使用以前在这些文件夹中的文件os.unlink
。 这会导致错误。
发布的glob
解决scheme也将尝试删除非空文件夹,从而导致错误。
我build议你使用:
folder_path = '/path/to/folder' for file_object in os.listdir(folder_path): file_object_path = os.path.join(folder_path, file_object) if os.path.isfile(file_object_path): os.unlink(file_object_path) else: shutil.rmtree(file_object_path)
作为一个oneliner:
import os # Python 2.7 map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) # Python 3+ list( map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) )
对于文件和目录来说,更强大的解决scheme是(2.7):
def rm(f): if os.path.isdir(f): return os.rmdir(f) if os.path.isfile(f): return os.unlink(f) raise TypeError, 'must be either file or directory' map( rm, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
你可能会更好使用os.walk()
。
os.listdir()
不会将文件与目录区分开来,并且尝试取消链接时会很快陷入困境。 有一个很好的例子,使用os.walk()
在这里recursion地删除一个目录,并提示如何适应你的情况。
注:如果有人投下我的答案,我在这里有一些解释。
- 每个人都喜欢简短的答案。 但是,有时现实并不那么简单。
- 回到我的答案。 我知道
shutil.rmtree()
可以用来删除目录树。 我在自己的项目中多次使用过它。 但是你必须认识到,目录本身也将被shutil.rmtree()
删除 。 虽然这可能是可以接受的一些,这不是一个有效的答案删除文件夹的内容(没有副作用) 。 - 我会告诉你一个副作用的例子。 假设你有一个拥有自定义拥有者和模式位的目录,那里有很多内容。 然后用
shutil.rmtree()
将其删除,然后用shutil.rmtree()
重新os.mkdir()
。 你会得到一个空的目录,而不是默认 (inheritance)所有者和模式位。 虽然您可能有权删除内容甚至是目录,但是您可能无法设置目录中的原始所有者和模式位(例如,您不是超级用户)。 - 最后, 耐心的阅读代码 。 这是漫长而丑陋的(看得见),但被certificate是可靠和高效的(使用中)。
这是一个漫长而丑陋的,但可靠和有效的解决scheme。
它解决了一些其他答复者没有解决的问题:
- 它正确地处理符号链接,包括不在符号链接上调用
shutil.rmtree()
os.path.isdir()
如果链接到一个目录,它将通过os.path.isdir()
testing;即使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, onerror=_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的官方网站有趣的东西。 只是为了共享删除目录中的所有内容的另一个想法。 因为使用shutil.rmtree()时我有一些授权问题,我不想删除该目录并重新创build它。 原始地址是http://docs.python.org/2/library/os.html#os.walk 。 希望可以帮助别人。
def emptydir(top): if(top == '/' or top == "\\"): return else: for root, dirs, files in os.walk(top, topdown=False): for name in files: os.remove(os.path.join(root, name)) for name in dirs: os.rmdir(os.path.join(root, name))
我曾经这样解决这个问题:
import shutil import os shutil.rmtree(dirpath) os.mkdir(dirpath)
另一个解决scheme:
import sh sh.rm(sh.glob('/path/to/folder/*'))
这是迄今唯一的答案,其中:
- 删除所有的符号链接
- 死链接
- 链接到目录
- 链接到文件
- 删除子目录
- 不会删除父目录
码:
for filename in os.listdir(dirpath): filepath = os.path.join(dirpath, filename) try: shutil.rmtree(filepath) except OSError: os.remove(filepath)
与其他许多答案一样,这不会尝试调整权限以启用删除文件/目录。
import os import shutil # Gather directory contents contents = [os.path.join(target_dir, i) for i in os.listdir(target_dir)] # Iterate and remove each item in the appropriate manner [os.remove(i) if os.path.isfile(i) or os.path.islink(i) else shutil.rmtree(i) for i in contents]
之前的评论也提到在Python 3.5+中使用os.scandir。 例如:
import os import shutil with os.scandir(target_dir) as entries: for entry in entries: if entry.is_file() or entry.is_symlink(): os.remove(entry.path) elif entry.is_dir(): shutil.rmtree(entry.path)
我通过添加time.sleep()来解决rmtree makedirs的错误问题。
if os.path.isdir(folder_location): shutil.rmtree(folder_location) time.sleep(.5) os.makedirs(folder_location, 0o777)
回答一个有限的具体情况:假设你想在维护子文件夹树时删除文件,可以使用recursionalgorithm:
import os def recursively_remove_files(f): if os.path.isfile(f): os.unlink(f) elif os.path.isdir(f): map(recursively_remove_files, [os.path.join(f,fi) for fi in os.listdir(f)]) recursively_remove_files(my_directory)
也许有点脱离主题,但我想很多人会觉得它有用
这应该做的伎俩只是使用操作系统模块列出,然后删除!
import os DIR = os.list('Folder') for i in range(len(DIR)): os.remove('Folder'+chr(92)+i)
为我工作,任何问题都让我知道!