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

时间:2010-10-07 15:17:14

标签: python file-io

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

6 个答案:

答案 0 :(得分:28)

要非递归地计算文件和目录,您可以使用os.listdir并查看其长度。

要递归计算文件和目录,可以使用os.walk迭代目录中的文件和子目录。

如果您只想计算文件而不是目录,可以使用os.listdiros.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])

我从this thread找到了一些这些想法。

答案 1 :(得分:6)

您可以使用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

答案 2 :(得分:6)

Mark Byer的回答简单,优雅,与蟒蛇精神相得益彰。

有一个问题,但是:如果你尝试为“。”之外的任何其他目录运行它,它将失败,因为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))])

此外,如果你要做很多事情并且需要性能,你可能想要在不产生额外列表的情况下这样做。这是一个不那么优雅,非常有效的解决方案:

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)

答案 3 :(得分:3)

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

答案 4 :(得分:0)

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

OR

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

答案 5 :(得分:0)

递归解决方案:

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

对于当前目录解决方案:

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