【问题标题】:Finding empty directories in Python在 Python 中查找空目录
【发布时间】:2011-09-07 02:30:11
【问题描述】:

全部,

在删除目录之前检查目录中是否有数据的最佳方法是什么?我正在浏览几个页面以使用 wget 查找一些图片,当然每个页面上都没有图像,但仍会创建目录。

dir = 'Files\\%s' % (directory)
os.mkdir(dir)
cmd = 'wget -r -l1 -nd -np -A.jpg,.png,.gif -P %s %s' %(dir,  i[1])
os.system(cmd)
if not os.path.isdir(dir):
    os.rmdir(dir)

我想测试一个文件是否在创建后被放到了目录中。如果什么都没有...删除它。

谢谢, 亚当

【问题讨论】:

  • 定义“空”。如果有子目录怎么办?是否应该检查他们的数据?如果其中没有数据,是否也应该删除它们?
  • 在这种情况下,我没有任何子目录,只有一个文件夹,其中可能有也可能没有图片。
  • 请不要使用os.system调用wget。使用 subprocess.Popen
  • 本质上:isempty = lambda path : not next(os.scandir(path), None)
  • 不要使用 os.listdir 或尝试,除了语句。 os.scandir 的速度要快几个数量级。

标签: python rmdir


【解决方案1】:
import os

if not os.listdir(dir):
    os.rmdir(dir)

LBYL 风格。
对于EAFP,请参阅 mouad 的回答。

【讨论】:

  • 如果目录包含数千个文件,os.listdir(dir) 返回大小会是个问题吗? @Corey Goldberg
【解决方案2】:

我会像这样选择EAFP

try:
    os.rmdir(dir)
except OSError as ex:
    if ex.errno == errno.ENOTEMPTY:
        print "directory not empty"

os.rmdir 不会删除非空目录。

【讨论】:

  • +1:简单。直接的。并且它将所有棘手的决策委托给它所属的操作系统。
  • 请注意,此函数会静默删除您可能想要报告的所有其他错误(例如EACCESS)。请注意,天真地修复它可能会导致报告非空目录的错误,您可能想忽略这些错误。不像看起来那么简单:-)
  • else: raise 怎么样?
  • 很好,但是:NameError: name 'errno' is not defined 你需要import errno
【解决方案3】:

试试:

if not os.listdir(dir): 
    print "Empty"

if os.listdir(dir) == []:
    print "Empty"

【讨论】:

    【解决方案4】:

    现在可以在Python3.5+ 中更有效地完成此操作,因为无需构建目录内容列表来查看其是否为空:

    import os
    
    def is_dir_empty(path):
        with os.scandir(path) as scan:
            return next(scan, None) is None
    

    示例用法:

    
    if os.path.isdir(directory) and is_dir_empty(directory):
        os.rmdir(directory)
    

    【讨论】:

      【解决方案5】:

      如果您确实检查了目录是否存在,以及目录中是否有内容...类似于:

      if os.path.isdir(dir) and len(os.listdir(dir)) == 0:
          os.rmdir(dir)
      

      【讨论】:

        【解决方案6】:

        如果已经创建了空目录,您可以将此脚本放在外部目录中并运行它:

        import os
        
        def _visit(arg, dirname, names):
            if not names:
                print 'Remove %s' % dirname
                os.rmdir(dirname)
        
        def run(outer_dir):
            os.path.walk(outer_dir, _visit, 0)
        
        if __name__ == '__main__':
            outer_dir = os.path.dirname(__file__)
            run(outer_dir)
            os.system('pause')
        

        【讨论】:

          【解决方案7】:

          这是检查目录是否为空的最快和优化的方法。

          empty = False
          for dirpath, dirnames, files in os.walk(dir):
              if files:
                  print("Not empty !") ;
              if not files:
                  print("It is empty !" )
                  empty = True
              break ;
          

          这里提到的其他答案是不快因为,如果你想使用通常的os.listdir(),如果目录有太多文件,它会你的代码如果您使用os.rmdir( ) 方法来尝试捕获错误,那么它只会删除该文件夹。如果您只想检查是否有空,这可能不是您想做的事情。

          【讨论】:

          • 使用os.scandir速度快,优点是更清晰,不需要生成不用的列表。
          【解决方案8】:

          我有关注Bash checking if folder has contents回答。

          主要是与@ideasman42 在https://stackoverflow.com/a/47363995/2402577 上的回答类似,为了不构建完整的列表,这可能也适用于Debian

          没有必要建立一个目录内容列表只是为了 看看它是否为空:


          os.walk('.') 返回一个目录下的完整文件,如果有数千个文件可能效率低下。而是遵循命令find "$target" -mindepth 1 -print -quit 返回第一个找到的文件并退出。如果返回一个空字符串,则表示文件夹为空。

          您可以使用find 检查目录是否为空,并处理其 输出

          def is_dir_empty(absolute_path):
              cmd = ["find", absolute_path, "-mindepth", "1", "-print", "-quit"]
              output = subprocess.check_output(cmd).decode("utf-8").strip()
              return not output
          
          print is_dir_empty("some/path/here")
          

          【讨论】:

            【解决方案9】:
            import os
            import tempfile
            
            root = tempfile.gettempdir()
            EMPTYDIRS = []
            
            for path, subdirs, files in os.walk(r'' + root ):
                if len( files ) == 0 and len( subdirs ) == 0:
                    EMPTYDIRS.append( path )
            
            for e in EMPTYDIRS:
                print e
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-09-05
              • 2011-02-18
              • 2021-03-08
              • 1970-01-01
              • 1970-01-01
              • 2015-05-22
              • 1970-01-01
              • 2013-05-31
              相关资源
              最近更新 更多