如何删除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)的错误,其中funcos.listdiros.removeos.rmdir ; path是导致它失败的那个函数的参数; 而exc_info是由sys.exc_info()返回的元组。 如果ignore_errors为false并且onerrorNone ,则会引发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地删除一个目录,并提示如何适应你的情况。

注:如果有人投下我的答案,我在这里有一些解释。

  1. 每个人都喜欢简短的答案。 但是,有时现实并不那么简单。
  2. 回到我的答案。 我知道shutil.rmtree()可以用来删除目录树。 我在自己的项目中多次使用过它。 但是你必须认识到,目录本身也将被shutil.rmtree()删除 。 虽然这可能是可以接受的一些,这不是一个有效的答案删除文件夹的内容(没有副作用)
  3. 我会告诉你一个副作用的例子。 假设你有一个拥有自定义拥有者和模式位的目录,那里有很多内容。 然后用shutil.rmtree()将其删除,然后用shutil.rmtree()重新os.mkdir() 。 你会得到一个空的目录,而不是默认 (inheritance)所有者和模式位。 虽然您可能有权删除内容甚至是目录,但是您可能无法设置目录中的原始所有者和模式位(例如,您不是超级用户)。
  4. 最后, 耐心的阅读代码 。 这是漫长而丑陋的(看得见),但被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) 

为我工作,任何问题都让我知道!