计算目录和子目录中的文件数

时间:2019-06-23 11:42:12

标签: python python-3.x

我试图计算目录和子目录中的文件数,但答案错误。

我有一个文件夹名称:train,其中包含10个子文件夹。每个子文件夹包含900个文件。

当我用以下代码计数文件时,我得到0个错误的文件(必须为9000)。 看来isfile无效。 我想念什么?

TRAIN_IMAGES_DIR = 'C:\\test\\train\\'


NUM_OF_FILES = 0
for subdir, dirs, files in os.walk(TRAIN_IMAGES_DIR):
    for file in files:
        print (file)
        if os.path.isfile(file):                
            NUM_OF_FILES = NUM_OF_FILES + 1
        else:
            print("Folder: ", file)

print (NUM_OF_FILES)

我正在使用python 3.7

2 个答案:

答案 0 :(得分:3)

您根本不需要使用isfile() ,因为os.walk()已经为您分离了目录和文件。正确完成后,对于files列表中的所有元素,测试将为True。

出问题的是,每个文件名都是相对的 ,它只是路径的最后一个元素。 os.path.isfile()只能在当前工作目录中查找此类名称,而实际上不是这些文件所在的位置。您必须使用os.path.join(subdir, file)将相对文件名转换为绝对路径。

但是,再次,不要使用isfile(),这只是双重工作。 os.walk()已经为您整理了文件。

以下内容可以计算您的文件数:

NUM_OF_FILES = 0
for subdir, dirs, files in os.walk(TRAIN_IMAGES_DIR):
    NUM_OF_FILES = NUM_OF_FILES + len(files)

因为您只需要在这里知道列表的长度即可。您也可以使用NUM_OF_FILES += len(files)添加长度。

使用sum() functiongenerator expression,甚至更短:

NUM_OF_FILES = sum(len(files) for _, _, files in os.walk(TRAIN_IMAGES_DIR))

如果这产生的数量高于预期的编号,则意味着您拥有的文件数量超出了预期。例如,您可能有 hidden 文件(在POSIX系统上,任何以.开头的文件都将从目录列表中隐藏,除非您使用ls -a或类似的技术来显示它们)

您也许可以先使用文件扩展名过滤文件; os.path.splitext(file)为此可以给您一个(base, ext)元组。或者只是滤除file[0] == "."值。

答案 1 :(得分:0)

Pathlib glob较慢,但在不需要超级速度时方便。

def __get_files(p:PathOrStr):
    p = Path(p)
    res = [] # result list    
    return p.glob("**/*") # all the files

gen = __get_files(p=r"C:\Users\dj\")

for _ in gen:
     print(_)