Hea*_*her 26 python python-3.4
我到处寻找这个答案却找不到.
我正在尝试创建一个脚本来搜索特定的子文件夹,然后检查它是否包含任何文件,如果是,则写出文件夹的路径.我已经找到了子文件夹搜索部分,但检查文件是困扰我.
我找到了关于如何检查文件夹是否为空的多个建议,并且我已经尝试修改脚本以检查文件夹是否为空,但是我没有得到正确的结果.
这是最接近的脚本:
for dirpath, dirnames, files in os.walk('.'):
if os.listdir(dirpath)==[]:
print(dirpath)
Run Code Online (Sandbox Code Playgroud)
这将列出所有空的子文件夹,但如果我尝试将其更改为:
if os.listdir(dirpath)!=[]:
print(dirpath)
Run Code Online (Sandbox Code Playgroud)
它将列出所有内容 - 而不仅仅是那些包含文件的子文件夹.
如果有人能指出我正确的方向,我真的很感激.
如果重要的话,这适用于Python 3.4.
感谢你给与我的帮助.
tde*_*ney 25
'files'已经告诉你目录中有什么.检查一下:
for dirpath, dirnames, files in os.walk('.'):
if files:
print(dirpath, 'has files')
if not files:
print(dirpath, 'is empty')
Run Code Online (Sandbox Code Playgroud)
Pra*_*iel 21
添加到@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(sorted(Path('some/path/here').rglob('*')))
Run Code Online (Sandbox Code Playgroud)
vogdb 方法尝试遍历给定目录中的所有文件。如果没有文件,any() 将为 False。我们用 not 否定它,所以 is_empty 如果没有文件则为 True,如果有文件则为 False。
sorted(Path(path_here).rglob('*')) 返回已排序 PosixPah 项目的列表。如果没有项目,则返回一个空列表,即 False。因此,如果路径为空,则 is_empty 将为 True,如果路径有内容则为 false
类似的想法结果 {} 和 [] 给出了相同的结果:

Jon*_*nts 11
您可以使用pathlibPython 3.4中引入的新库以递归方式提取所有非空子目录,例如:
import pathlib
root = pathlib.Path('some/path/here')
non_empty_dirs = {str(p.parent) for p in root.rglob('*') if p.is_file()}
Run Code Online (Sandbox Code Playgroud)
因为无论如何你必须走树,我们构建了一组父目录,其中存在一个文件,该目录产生一组包含文件的目录 - 然后按照你的意愿对结果进行操作.
如果可以删除目录,则可以使用以下命令:
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
Run Code Online (Sandbox Code Playgroud)
该os.rmdir只删除一个目录,如果它是空的,否则它抛出OSERROR例外。
您可以在以下位置找到有关此问题的讨论:
例如,当您打算执行 git clone 时删除一个空目录是可以的,但如果您事先检查目录是否为空,则删除一个空目录就可以了,因此您的程序不会抛出空目录错误。
检查文件夹是否包含文件:
import os
import shutil
if len(os.listdir(folder_path)) == 0: # Check is empty..
shutil.rmtree(folder_path) # Delete..
Run Code Online (Sandbox Code Playgroud)