How do I read the number of files in a folder using Python?

后端 未结 6 1985
醉酒成梦
醉酒成梦 2021-02-07 11:56

How do I read the number of files in a specific folder using Python? Example code would be awesome!

相关标签:
6条回答
  • 2021-02-07 12:16

    To count files and directories non-recursively you can use os.listdir and take its length.

    To count files and directories recursively you can use os.walk to iterate over the files and subdirectories in the directory.

    If you only want to count files not directories you can use os.listdir and os.path.file to check if each entry is a file:

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

    Or alternatively using a generator:

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

    Or you can use os.walk as follows:

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

    I found some of these ideas from this thread.

    0 讨论(0)
  • 2021-02-07 12:23

    pathlib, that is new in v. 3.4, makes like easier. The line labelled 1 makes a non-recursive list of the current folder, the one labelled 2 the recursive list.

    from pathlib import Path
    
    import os
    os.chdir('c:/utilities')
    
    print (len(list(Path('.').glob('*')))) ## 1
    print (len(list(Path('.').glob('**/*')))) ## 2
    

    There are more goodies too. With these additional lines you can see both the absolute and relative file names for those items that are files.

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

    Result:

    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
    
    0 讨论(0)
  • 2021-02-07 12:24

    You can use the glob module:

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

    Or, as Mark Byers suggests in his answer, if you only want files:

    >>> 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
    
    0 讨论(0)
  • 2021-02-07 12:29

    Mark Byer's answer is simple, elegant, and goes along with the python spirit.

    There's a problem, however: if you try to run that for any other directory than ".", it will fail, since os.listdir() returns the names of the files, not the full path. Those two are the same when listing the current working directory, so the error goes undetected in the source above.

    For example, if your at "/home/me" and you list "/tmp", you'll get (say) ['flashXVA67']. You'll be testing "/home/me/flashXVA67" instead of "/tmp/flashXVA67" with the method above.

    You can fix this using os.path.join(), like this:

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

    Also, if you're going to be doing this count a lot and require performance, you may want to do it without generating additional lists. Here's a less elegant, unpythonesque yet efficient solution:

    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)
    
    0 讨论(0)
  • 2021-02-07 12:35
    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)])
    
    0 讨论(0)
  • 2021-02-07 12:38

    recursive solution:

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

    for current directory solution:

    len(os.walk(os.getcwd()).next()[2])
    
    0 讨论(0)
提交回复
热议问题