在Python中查找空目录

44

大家好,

在删除目录之前,检查该目录中是否存在数据的最佳方法是什么?我正在使用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)

我想测试一下,在文件创建之后,是否有文件被拖放到了指定的目录中。如果没有文件存在...则将其删除。

谢谢, Adam


定义“空”。如果有子目录怎么办?它们应该被检查以获取数据吗?如果其中没有数据,它们也应该被删除吗? - kwatford
在这种情况下,我没有子目录,只有一个可能包含照片的单个文件夹。 - aeupinhere
3
请勿使用os.system调用wget。请使用subprocess.Popen。 - Jakob Bowyer
本质上:isempty = lambda path : not next(os.scandir(path), None) - SurpriseDog
不要使用os.listdir或try, except语句。os.scandir快得多。 - SurpriseDog
8个回答

64
import os

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

LBYL风格。
有关EAFP,请参见mouad的回答。


2
如果目录包含数千个文件,os.listdir(dir) 返回的大小是否会成为问题?@Corey Goldberg - alper

48

我会选择采用EAFP, 代码如下:

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

os.rmdir函数不能删除非空目录。


2
+1:简单、直接,而且将所有棘手的决策委托给了它应该属于的操作系统。 - S.Lott
1
请注意,此函数会自动忽略所有其他错误(例如EACCESS),而您可能希望报告这些错误。请注意,简单地修复该问题可能会导致报告非空目录中的错误,而您可能希望忽略这些错误。这并不像看起来那么简单 :-) - André Caron
2
如何看待 else: raise - spectras
2
不错,但是:NameError: name 'errno' is not defined,你需要 import errno - ewerybody

17

尝试:

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

11

使用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)

2

如果您检查目录是否存在,以及目录中是否存在内容,会怎样呢?可能是这样的:

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

1
以下是最快且优化的检查目录是否为空的方法。
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()方法来尝试捕获错误,那么它将只是删除该文件夹。如果你只想检查是否为空,这可能不是你想要的结果。

1
使用 os.scandir 是快速的,具有更清晰的优势,并且不需要生成未使用的列表。 - ideasman42

1
如果空目录已经创建,您可以将此脚本放在外部目录中并运行它:
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')

0

我已经关注了Bash 检查文件夹是否有内容的答案。

主要是与@ideasman42在https://dev59.com/b2025IYBdhLWcg3wHR4Y#47363995的回答类似,为了避免构建完整的列表,这种方法可能也适用于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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接