如何用Python 3检查目录是否包含文件

53 投票
11 回答
65416 浏览
提问于 2025-04-19 22:01

我到处都在找这个答案,但就是找不到。

我想写一个脚本,去查找一个特定的子文件夹,然后检查里面是否有文件,如果有的话,就输出这个文件夹的路径。我已经搞定了查找子文件夹的部分,但检查文件的部分让我很困惑。

我找到过很多关于如何检查文件夹是否为空的建议,也尝试修改这些脚本来检查文件夹是否不为空,但结果总是不对。

这是我写的最接近的脚本:

for dirpath, dirnames, files in os.walk('.'):
if os.listdir(dirpath)==[]:
    print(dirpath)

这个脚本会列出所有空的子文件夹,但如果我试着把它改成:

if os.listdir(dirpath)!=[]:
    print(dirpath)

它就会列出所有东西——不仅仅是那些包含文件的子文件夹。

如果有人能给我指个方向,我会非常感激。

这个是针对Python 3.4的,如果这有关系的话。

谢谢你们能提供的任何帮助。

11 个回答

4

在编程中,有时候我们需要处理一些数据,这些数据可能来自不同的地方,比如用户输入、文件或者网络请求。为了让程序能够理解这些数据,我们通常需要将它们转换成一种程序能够处理的格式。

这个过程就像是把一种语言翻译成另一种语言。比如,你可能会把用户输入的文本转换成数字,或者把从网络上获取的数据解析成一个可以在程序中使用的对象。

在这个过程中,我们会用到一些工具和方法,比如字符串处理、数据解析等。这些工具可以帮助我们把复杂的数据变得简单易懂,从而让程序能够顺利运行。

总之,数据处理是编程中非常重要的一部分,掌握这些技能可以让你更好地与数据打交道。

entities = os.listdir(dirpath)
for entity in entities:
    if os.path.isfile(entity):
        print(dirpath)
        break
8

如果你可以删除这个文件夹,你可以使用下面的代码:

my_path = os.path.abspath("something")               
try:
    os.rmdir(my_path)
    is_empty = True
    # Do you need to keep the directory? Recreate it!
    # os.makedirs(my_path, exist_ok=True)
except OSError:
    is_empty = False

if is_empty:
    pass

os.rmdir 这个函数只能删除空的文件夹,如果文件夹里有东西,它就会报错,叫做 OSError。

你可以在这里找到相关讨论:

  1. https://bytes.com/topic/python/answers/157394-how-determine-if-folder-empty

举个例子,如果你打算执行 git clone 操作,删除一个空的文件夹是没问题的。但如果你事先想检查一下文件夹是否为空,以避免程序因为文件夹是空的而报错,那就不太合适了。

19

你可以使用Python 3.4新推出的pathlib库来递归地提取所有非空的子目录,比如:

import pathlib

root = pathlib.Path('some/path/here')
non_empty_dirs = {str(p.parent) for p in root.rglob('*') if p.is_file()}

因为你无论如何都需要遍历整个目录树,所以我们可以先建立一个包含有文件的父目录的集合,这样就得到了一个包含文件的目录集合——然后你可以根据这个结果进行你想做的操作。

49

在@Jon Clements提到的pathlib方法基础上,我想用pathlib来检查文件夹是否为空,但不想创建一个集合:

from pathlib import Path

# shorter version from @vogdb
is_empty = not any(Path('some/path/here').iterdir())

# similar but unnecessary complex
is_empty = not bool({_ for _ in Path('some/path/here').rglob('*')})

这个vogdb方法会尝试遍历给定目录中的所有文件。如果没有文件,any()的结果就是False。我们用not来反转这个结果,这样如果没有文件,is_empty就会是True,如果有文件,就会是False

使用sorted(Path(path_here).rglob('*'))会返回一个排序后的PosixPath项目列表。如果没有项目,它会返回一个空列表,这个空列表在逻辑上被认为是False。所以如果路径是空的,is_empty就会是True;如果路径里有东西,is_empty就会是False。

类似的想法是,{}和[]在逻辑上是相同的:

enter image description here
37

'files'已经告诉你目录里有什么了。你只需要检查一下:

for dirpath, dirnames, files in os.walk('.'):
    if files:
        print(dirpath, 'has files')
    if not files:
        print(dirpath, 'does not have files')

撰写回答