如何使用Python读取文件夹中的文件数量?

问题描述 投票:0回答:9

如何使用Python读取特定文件夹中的文件数量?示例代码会很棒!

python file-io
9个回答
32
投票

要非递归地计算文件和目录的数量,您可以使用

os.listdir
并获取其长度。

要递归计算文件和目录,您可以使用

os.walk
迭代目录中的文件和子目录。

如果您只想计算文件而不是目录,您可以使用

os.listdir
os.path.file
来检查每个条目是否是一个文件:

import os.path
path = '.'
num_files = len([f for f in os.listdir(path)
                if os.path.isfile(os.path.join(path, f))])

或者使用发电机:

num_files = sum(os.path.isfile(os.path.join(path, f)) for f in os.listdir(path))

或者您可以使用

os.walk
,如下所示:

len(os.walk(path).next()[2])

我从这个帖子中找到了一些想法。


29
投票

pathlib
,这是第 3.4 节中的新增内容,使生活变得更轻松。标记为 1 的行创建当前文件夹的非递归列表,标记为 2 的行创建递归列表。

from pathlib import Path

import os
os.chdir('c:/utilities')

print (len(list(Path('.').glob('*')))) ## 1
print (len(list(Path('.').glob('**/*')))) ## 2

还有更多好东西。通过这些附加行,您可以查看那些文件的项目的绝对和相对文件名。

for item in Path('.').glob('*'):
    if item.is_file():
        print (str(item), str(item.absolute()))

结果:

boxee.py c:\utilities\boxee.py
boxee_user_catalog.sqlite c:\utilities\boxee_user_catalog.sqlite
find RSS.py c:\utilities\find RSS.py
MyVideos34.sqlite c:\utilities\MyVideos34.sqlite
newsletter-1 c:\utilities\newsletter-1
notes.txt c:\utilities\notes.txt
README c:\utilities\README
saveHighlighted.ahk c:\utilities\saveHighlighted.ahk
saveHighlighted.ahk.bak c:\utilities\saveHighlighted.ahk.bak
temp.htm c:\utilities\temp.htm
to_csv.py c:\utilities\to_csv.py

7
投票

您可以使用 glob 模块:

>>> import glob
>>> print len(glob.glob('/tmp/*'))
10

或者,正如 Mark Byers 在他的回答中所建议的,如果您只想要文件:

>>> print [f for f in glob.glob('/tmp/*') if os.path.isfile(f)]
['/tmp/foo']
>>> print sum(os.path.isfile(f) for f in glob.glob('/tmp/*'))
1

6
投票

Mark Byer 的回答简单、优雅,并且符合 Python 精神。

但是有一个问题:如果您尝试对

"."
以外的任何其他目录运行该命令,它将失败,因为
os.listdir()
返回文件的名称,而不是完整路径。列出当前工作目录时,这两个是相同的,因此在上面的源代码中未检测到错误。

例如,如果您位于

/home/me
并且列出了
/tmp
,您将得到(比如说)
['flashXVA67']
。您将使用上述方法测试
/home/me/flashXVA67
而不是
/tmp/flashXVA67

您可以使用

os.path.join()
修复此问题,如下所示:

import os.path
path = './whatever'
count = len([f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))])

此外,如果您要大量执行此计数并且需要性能,您可能希望在不生成额外列表的情况下执行此操作。这是一个不太优雅、非Python风格但有效的解决方案:

import os

def fcount(path):
    """ Counts the number of files in a directory """
    count = 0
    for f in os.listdir(path):
        if os.path.isfile(os.path.join(path, f)):
            count += 1
            
    return count


# The following line prints the number of files in the current directory:
path = "./whatever"
print fcount(path)

1
投票

试试这个:

import os
for dirpath, dirnames, filenames in os.walk('./your/folder/path'):
    print(f'There are {len(dirnames)} directories and {len(filenames)} images in {dirpath}.')

结果将如下所示:

There are 10 directories and 0 images in ./asl_data/photos.
There are 0 directories and 32 images in ./asl_data/photos\0.
There are 0 directories and 34 images in ./asl_data/photos\1.
There are 0 directories and 32 images in ./asl_data/photos\2.
There are 0 directories and 31 images in ./asl_data/photos\3.
There are 0 directories and 34 images in ./asl_data/photos\4.
There are 0 directories and 31 images in ./asl_data/photos\5.
There are 0 directories and 40 images in ./asl_data/photos\6.
There are 0 directories and 33 images in ./asl_data/photos\7.
There are 0 directories and 30 images in ./asl_data/photos\8.
There are 0 directories and 39 images in ./asl_data/photos\9.

1
投票

我认为最简单的方法是使用

pathlib
并检查
iterdir()
方法结果的长度。例如:

from pathlib import Path


search_path = Path('<relative or absolute path>')
n_files = len([*search_path.iterdir()])

如果您只需要某些类型的文件,您可以自定义列表理解:

# only files
n_files = len([p for p in search_path.iterdir() if p.is_file()])

# only directories
n_files = len([p for p in search_path.iterdir() if p.is_dir()])

# only given extension
ext = '.png'
n_files = len([p for p in search_path.iterdir() if p.suffix==f'{ext}'])

0
投票
total = len(filter(
            lambda f: os.path.isfile(os.path.join(path_to_dir, f)),
            os.listdir(path_to_dir)))

total = sum([True for f in os.listdir(path_to_dir) if os.path.isfile(os.path.join([path_to_dir, f)])

0
投票

递归解法:

sum(len(fs) for _,_,fs in os.walk(os.getcwd()))

对于当前目录解决方案:

len(os.walk(os.getcwd()).next()[2])

0
投票

print(len(os.listdir(r"你的路径")))

© www.soinside.com 2019 - 2024. All rights reserved.