如何用Python 3检查目录是否包含文件
我到处都在找这个答案,但就是找不到。
我想写一个脚本,去查找一个特定的子文件夹,然后检查里面是否有文件,如果有的话,就输出这个文件夹的路径。我已经搞定了查找子文件夹的部分,但检查文件的部分让我很困惑。
我找到过很多关于如何检查文件夹是否为空的建议,也尝试修改这些脚本来检查文件夹是否不为空,但结果总是不对。
这是我写的最接近的脚本:
for dirpath, dirnames, files in os.walk('.'):
if os.listdir(dirpath)==[]:
print(dirpath)
这个脚本会列出所有空的子文件夹,但如果我试着把它改成:
if os.listdir(dirpath)!=[]:
print(dirpath)
它就会列出所有东西——不仅仅是那些包含文件的子文件夹。
如果有人能给我指个方向,我会非常感激。
这个是针对Python 3.4的,如果这有关系的话。
谢谢你们能提供的任何帮助。
11 个回答
在编程中,有时候我们需要处理一些数据,这些数据可能来自不同的地方,比如用户输入、文件或者网络请求。为了让程序能够理解这些数据,我们通常需要将它们转换成一种程序能够处理的格式。
这个过程就像是把一种语言翻译成另一种语言。比如,你可能会把用户输入的文本转换成数字,或者把从网络上获取的数据解析成一个可以在程序中使用的对象。
在这个过程中,我们会用到一些工具和方法,比如字符串处理、数据解析等。这些工具可以帮助我们把复杂的数据变得简单易懂,从而让程序能够顺利运行。
总之,数据处理是编程中非常重要的一部分,掌握这些技能可以让你更好地与数据打交道。
entities = os.listdir(dirpath)
for entity in entities:
if os.path.isfile(entity):
print(dirpath)
break
如果你可以删除这个文件夹,你可以使用下面的代码:
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。
你可以在这里找到相关讨论:
举个例子,如果你打算执行 git clone 操作,删除一个空的文件夹是没问题的。但如果你事先想检查一下文件夹是否为空,以避免程序因为文件夹是空的而报错,那就不太合适了。
你可以使用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()}
因为你无论如何都需要遍历整个目录树,所以我们可以先建立一个包含有文件的父目录的集合,这样就得到了一个包含文件的目录集合——然后你可以根据这个结果进行你想做的操作。
在@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。
类似的想法是,{}和[]在逻辑上是相同的:

'files'已经告诉你目录里有什么了。你只需要检查一下:
for dirpath, dirnames, files in os.walk('.'):
if files:
print(dirpath, 'has files')
if not files:
print(dirpath, 'does not have files')