我正在尝试检查文件夹是否为空,并执行以下操作:
import os
downloadsFolder = '../../Downloads/'
if not os.listdir(downloadsFolder):
print "empty"
else:
print "not empty"
不幸的是,无论我在文件夹中是否有任何文件,我总是得到“非空”提示。这是因为可能有一些隐藏的系统文件吗?是否有一种方法可以修改上面的代码仅检查非隐藏文件?
我正在尝试检查文件夹是否为空,并执行以下操作:
import os
downloadsFolder = '../../Downloads/'
if not os.listdir(downloadsFolder):
print "empty"
else:
print "not empty"
不幸的是,无论我在文件夹中是否有任何文件,我总是得到“非空”提示。这是因为可能有一些隐藏的系统文件吗?是否有一种方法可以修改上面的代码仅检查非隐藏文件?
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")
我希望对你有所帮助。
请注意,即使在目录中存在'.'和'..',os.listdir(dir_name)
也不包括它们。
自Python 3.5版本以来,
with os.scandir(path) as it:
if any(it):
print('not empty')
scandir()
通常比 listdir()
更快,因为 scandir()
是一个迭代器,不使用某些函数获取给定文件的统计信息。
Path.iterdir()
,但它在底层使用listdir()
,所以可能会更慢。有时,如果您的目录结构很大,您会想要使用iterdir()
而不是scandir()
,因为scandir()
可能会消耗文件描述符资源。 - ingyherelist(scandir())
而不是scandir()
本身,所以您在性能方面看到的差异和一般的scandir()
与listdir()
之间的差异是不同的。根据您要处理多少个文件以及对它们的操作,scandir()
和listdir()
可能更适合您。例如,请参阅https://bugs.python.org/issue23605. 这里的OP只需要知道目录中是否至少有1个文件,因此scandir()
会更快。 - Flairos.path.isdir
检查,因为scandir
会抛出异常。 - Shital Shahscandir
提供了比listdir
更多的信息,但即使对于整个目录,它仍然运行得更快(从这个答案中我理解到,https://dev59.com/lrjna4cB1Zd3GeqP2wJZ)。当然,如果不需要扫描所有内容,它将运行得更快。 - Yaroslav Nikitenkowith
做了相同的事情,也建议在您链接的官方文档中使用。 - Flair嗯,我刚试了一下你的代码,并将路径更改为空目录,它确实为我打印出了“empty”,因此您的下载文件夹中必须有隐藏文件。您可以尝试循环遍历所有文件并检查它们是否以 '.' 开头。
编辑:
尝试这个,它对我起作用了。
if [f for f in os.listdir(downloadsFolder) if not f.startswith('.')] == []:
print "empty"
else:
print "not empty"
正如muskaya在这里提到的那样,自Python 3.4(标准库)以来,您还可以使用pathlib。但是,如果您只想检查文件夹是否为空,则应查看此答案:
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"
尝试一下:
import os
dirContents = os.listdir(downloadsFolder)
if not dirContents:
print('Folder is Empty')
else:
print('Folder is Not Empty')
扩展@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
"""
try:
if any(scandir(dir_name)):
return True
except (NotADirectoryError, FileNotFoundError):
pass
return False
if is_directory(path) and is_empty_directory(path)
看起来更加明确(因此更符合 Pythonic)。否则,有些人可能会认为“非空目录 => 有内容的目录”,这是错误的。此外,如果以is_
开头调用它,则布尔类型提示可能是多余的(至少对于程序员而言,而不是自动工具)。希望这可以帮到您! - Yaroslav Nikitenkoimport glob
if len(glob.glob("input\*")) == 0:
print("No files found to Process...")
exit()
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')
另一个版本:
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")
简而言之(适用于 Python 3.10.4):if not os.listdir(dirname): ...
这里有一个快速演示:
$ rm -rf BBB
$ mkdir BBB
$ echo -e "import os\nif os.listdir(\"BBB\"):\n print(\"non-empty\")\nelse:\n print(\"empty\")" > empty.py
$ python empty.py
empty
$ echo "lorem ipsum" > BBB/some_file.txt
$ python empty.py
non-empty
$ rm BBB/some_file.txt
$ python empty.py
empty
print os.listdir(downloadsFolder)
时,您将获得下载文件夹中所有文件和文件夹的名称列表。 - mkrieger1