【问题标题】:Remove all files in a directory删除目录中的所有文件
【发布时间】:2010-11-05 14:22:14
【问题描述】:

试图删除某个目录中的所有文件会给我以下错误:

OSError: [Errno 2] 没有这样的文件或目录:'/home/me/test/*'

我运行的代码是:

import os
test = "/home/me/test/*"
os.remove(test)

【问题讨论】:

标签: python unix file-management


【解决方案1】:

删除文件夹中的所有文件。

import os
import glob

files = glob.glob(os.path.join('path/to/folder/*'))
files = glob.glob(os.path.join('path/to/folder/*.csv')) // It will give all csv files in folder
for file in files:
    os.remove(file)

【讨论】:

    【解决方案2】:

    有点小技巧,但如果您想保留目录,可以使用以下内容。

    import os
    import shutil
    shutil.rmtree('/home/me/test') 
    os.mkdir('/home/me/test')
    

    【讨论】:

      【解决方案3】:

      这将获取目录中的所有文件并删除它们。

      import os
      
      BASE_DIR = os.path.dirname(os.path.abspath(__file__))
      dir = os.path.join(BASE_DIR, "foldername")
      
      for root, dirs, files in os.walk(dir):
        for file in files:
          path = os.path.join(dir, file)
          os.remove(path)
      

      【讨论】:

        【解决方案4】:

        虽然这是一个老问题,但我认为没有人使用这种方法回答过:

        # python 2.7
        import os
        
        d='/home/me/test'
        filesToRemove = [os.path.join(d,f) for f in os.listdir(d)]
        for f in filesToRemove:
            os.remove(f) 
        

        【讨论】:

        • 在使用os.remove() 时需要包含文件的完整路径,因此您必须使用os.remove(os.path.join("/home/me/test", f)) 才能使其正常工作。
        • 加上行 os.remove(f) for f in files 是无效的语法。并非所有事情都使用理解。
        • 我非常喜欢这个答案,使用os 电话。我把它作为我工作的基础:filesToRemove = [f for f in os.listdir(self.my_folder)] for f in filesToRemove: os.remove(os.path.join(self.my_folder, f))(需要缩进)。
        • 如果我想使用相对路径怎么办?请帮忙
        • @deef - 我重新考虑了这个要求。
        【解决方案5】:

        os.remove() 不适用于目录,os.rmdir() 仅适用于空目录。而且 Python 不会像某些 shell 那样自动扩展“/home/me/test/*”。

        不过,您可以在目录上使用shutil.rmtree() 来执行此操作。

        import shutil
        shutil.rmtree('/home/me/test') 
        

        小心,因为它会删除文件和子目录

        【讨论】:

        • 进口shutil; shutil.rmtree('/home/me/test')
        • 请注意,使用 shutil.rmtree() 也会删除给定路径末尾的文件夹(它不会删除目录内容它会删除目录)
        • 这并不能解释为什么/home/me/test/* 不被os.remove 接受。我已经编辑了答案。
        • 这个答案不正确,因为它没有保留清空的目录。
        【解决方案6】:
        #python 2.7
        import tempfile
        import shutil
        import exceptions
        import os
        
        def TempCleaner():
            temp_dir_name = tempfile.gettempdir()
            for currentdir in os.listdir(temp_dir_name):
                try:
                   shutil.rmtree(os.path.join(temp_dir_name, currentdir))
                except exceptions.WindowsError, e:
                    print u'Не удалось удалить:'+ e.filename
        

        【讨论】:

          【解决方案7】:

          请在此处查看我的答案:

          https://stackoverflow.com/a/24844618/2293304

          这是一个冗长而丑陋但可靠且高效的解决方案。

          它解决了其他回答者没有解决的一些问题:

          • 它正确处理符号链接,包括不在符号链接上调用shutil.rmtree()(如果链接到目录,它将通过os.path.isdir() 测试)。
          • 它可以很好地处理只读文件。

          【讨论】:

          • 在这种情况下,最好的方法是标记为重复。
          【解决方案8】:

          我这样做的另一种方式:

          os.popen('rm -f ./yourdir')
          

          【讨论】:

          • 不可移植,rm -f directory 根本不起作用。我想知道为什么这会受到如此多的支持。
          【解决方案9】:

          shutil.rmtree() 对于大多数情况。但它不适用于 Windows 中的只读文件。对于 windows 从 PyWin32 导入 win32api 和 win32con 模块。

          def rmtree(dirname):
              retry = True
              while retry:
                  retry = False
                  try:
                      shutil.rmtree(dirname)
                  except exceptions.WindowsError, e:
                      if e.winerror == 5: # No write permission
                          win32api.SetFileAttributes(dirname, win32con.FILE_ATTRIBUTE_NORMAL)
                          retry = True
          

          【讨论】:

            【解决方案10】:

            star 由 Unix shell 扩展。您的调用没有访问 shell,它只是试图删除名称以星号结尾的文件

            【讨论】:

              【解决方案11】:

              os.remove 不能解析 unix 样式的模式。如果您使用的是类 unix 系统,您可以:

              os.system('rm '+test)
              

              你也可以:

              import glob, os
              test = '/path/*'
              r = glob.glob(test)
              for i in r:
                 os.remove(i)
              

              【讨论】:

              • os.system 有很多注意事项,包括也不解析 glob 模式(因为它只是将行传递给 shell); glob 返回目录和文件(os.remove 不处理)
              • 迄今为止最好的答案:
              【解决方案12】:

              因为 * 是一个 shell 结构。 Python 实际上是在 /home/me/test 目录中寻找一个名为“*”的文件。首先使用 listdir 获取文件列表,然后对每个文件调用 remove。

              【讨论】:

                【解决方案13】:

                os.remove 只会删除一个文件。

                要使用通配符删除,您需要编写自己的例程来处理此问题。

                此论坛页面上列出了quite a few suggested approaches

                【讨论】:

                  猜你喜欢
                  • 2014-04-06
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-06-11
                  相关资源
                  最近更新 更多