【问题标题】:How to check if folder is empty with Python?如何使用 Python 检查文件夹是否为空?
【发布时间】:2018-03-14 17:19:18
【问题描述】:

我正在尝试检查文件夹是否为空并执行以下操作:

import os
downloadsFolder = '../../Downloads/'
if not os.listdir(downloadsFolder):
    print "empty"
else:
    print "not empty"

不幸的是,无论该文件夹中是否有任何文件,我总是得到“非空”。是不是因为可能有一些隐藏的系统文件?有没有办法修改上面的代码来检查不是隐藏的文件?

【问题讨论】:

标签: python python-2.7


【解决方案1】:

您可以在os module 中使用这两种方法。

第一个选项:

import os
if len(os.listdir('/your/path')) == 0:
    print("Directory is empty")
else:    
    print("Directory is not empty")

第二个选项(因为空列表在 Python 中计算为 False):

import os
if not os.listdir('/your/path'):
    print("Directory is empty")
else:    
    print("Directory is not empty")

但是,os.listdir() 可能会引发异常,例如当给定路径不存在时。因此,您需要涵盖这一点。

import os
dir_name = '/your/path'
if os.path.isdir(dir_name):
    if not os.listdir(dir_name):
        print("Directory is empty")
    else:    
        print("Directory is not empty")
else:
    print("Given directory doesn't exist")

希望对你有帮助。

【讨论】:

  • thispointer.com/python-how-to-check-if-a-directory-is-empty 上几乎逐字逐句地找到了这个答案。找不到文章的发表日期,所以无法判断一种或另一种方式
  • 嘿 Rimov,当我写答案时,我正在保存和排序文件夹及其文件,以便在 Python 中进行分析。当时,我看到了这个问题,只是在这里分享了我的代码块。这篇文章我不知道,但是Python中有处理文件夹/文件检查的基本方法/途径,所以你可以在网上看到类似的代码。
【解决方案2】:

自 Python 3.5+ 起,

if any(os.scandir(path)):
   print('not empty')

它通常比listdir() 执行得更快,因为scandir() 是一个迭代器并且不使用某些函数来获取给定文件的统计信息。

【讨论】:

  • 还有Path.iterdir(),但它在封面下使用listdir(),所以可能更慢。有时,如果你的目录结构很大,你会想要iterdir() 而不是scandir(),因为scandir() 可以是resource intensive with file descriptors
  • @ingyhere 所以你在那里看到的性能差异与一般scandir()listdir() 的区别在于使用list(scandir()) 而不是scandir() 本身。根据您浏览的文件数量以及您对它们的处理方式,scandir()listdir() 可能对您更有利,也可能不会。例如,bugs.python.org/issue23605。这里的OP只需要知道目录中是否至少有1个文件,所以scandir()会更快。
  • 提示:scandir 如果目录不存在则抛出异常,因此请包含os.path.isdir 检查。
【解决方案3】:

正如muskaya 在这里提到的。您也可以使用pathlib。但是,如果您只想检查文件夹是否为空,则应查看此answser

from pathlib import Path

def directory_is_empty(directory: str) -> bool:
    return not any(Path(directory).iterdir())


downloadsFolder = '../../Downloads/'
if directory_is_empty(downloadsFolder):
    print "empty"
else:
    print "not empty"

【讨论】:

    【解决方案4】:

    试一试:

    import os
    dirContents = os.listdir(downloadsFolder)
    if not dirContents:
        print('Folder is Empty')
    else:
        print('Folder is Not Empty')
    

    【讨论】:

      【解决方案5】:

      嗯,我刚刚尝试将您的代码更改为空目录的路径,它确实为我打印了“空”,因此您的下载中必须有隐藏文件。您可以尝试遍历所有文件并检查它们是否以“。”开头与否。

      编辑:

      试试这个。它对我有用。

      if [f for f in os.listdir(downloadsFolder) if not f.startswith('.')] == []:
          print "empty"
      else: 
          print "not empty"
      

      【讨论】:

        【解决方案6】:

        通过错误处理扩展@Flair 的答案:

        你可以使用os.scandir:

        from os import scandir
        
        
        def is_non_empty_dir(dir_name: str) -> bool:
            """
            Returns True if the directory exists and contains item(s) else False
            """
            success = False
            try:
                if any(scandir(dir_name)):
                    success = True
            except NotADirectoryError:
                pass
            except FileNotFoundError:
                pass
            return success
        

        【讨论】:

        • 您的答案似乎比其他答案更复杂。为什么要使用 for 循环?
        • 在发现 Pathlib 内部使用 os.scandir 后,我修改了答案
        【解决方案7】:

        我想你可以试试这个代码:

        directory = r'path to the directory'
        
        from os import walk
        
        f = [] #to list the files
        
        d = [] # to list the directories
        
        
        for (dirpath, dirnames, filenames) in walk(directory):
        
            f.extend(filenames)
            d.extend(dirnames)
            break
        
        if len(f) and len(d) != 0:
            print('Not empty')
        else:
            print('empty')
        

        【讨论】:

          【解决方案8】:

          在 python os 中,有一个名为listdir 的函数,它返回给定目录的文件内容数组。因此,如果数组为空,则表示目录中没有文件。

          这里是一个代码sn-p;

          import os 
          path = '../../Downloads' 
          if os.listdir(path) == []: 
              print "Empty" 
          else: 
              print "Not empty"  
          

          希望这是您正在寻找的。

          【讨论】:

            【解决方案9】:

            另一个版本:

            def is_folder_empty(dir_name):
                import os
                if os.path.exists(dir_name) and os.path.isdir(dir_name):
                    return not os.listdir(dir_name)
                else:
                    raise Exception(f"Given output directory {dir_name} doesn't exist")
            

            【讨论】:

              【解决方案10】:

              您可以使用以下方法来验证输入文件夹中不存在任何文件:

              import glob
              
              if len(glob.glob("input\*")) == 0:
                  print("No files found to Process...")
                  exit()
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-10-19
                • 2014-10-29
                • 2017-02-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多