在os.walk期间获取文件大小

时间:2011-07-21 13:09:21

标签: python

我使用os.walk来比较两个文件夹,看看它们是否包含完全相同的文件。但是,这仅检查文件名。我想确保文件大小相同,如果它们有不同的报告。你能从os.walk获得文件大小吗?

4 个答案:

答案 0 :(得分:7)

与使用os.walk而不使用os.stat获取文件大小的方式相同。你只需要记住加入root:

for root, dirs, files in os.walk(some_directory):
    for fn in files:
        path = os.path.join(root, fn)
        size = os.stat(path).st_size # in bytes

        # ...

答案 1 :(得分:2)

os.path.getsize(path)可以为您提供文件的文件大小,但是具有相同大小的两个文件并不总是意味着它们是相同的。您可以阅读该文件的内容,并将其与MD5或Hash进行比较。

答案 2 :(得分:1)

正如其他人所说:你可以使用stat获得大小。但是,对于dirs之间的比较,您可以使用dircmp

答案 3 :(得分:0)

仅供参考,Python 3中有a more efficient solution

import os

with os.scandir(rootdir) as it:
    for entry in it:
        if entry.is_file():
            filepath = entry.path # absolute path
            filesize = entry.stat().st_size

有关变量entry的更多详细信息,请参见os.DirEntry

请注意,以上内容不是是递归的(不会浏览子文件夹)。为了获得类似os.walk的行为,您可能需要使用类似以下内容的方法:

from collections import namedtuple

_wrap_entry = namedtuple( 'DirEntryWrapper', 'name path islink size' )
def scantree( rootdir, follow_links=False, reldir='' ):
    visited = set()
    rootdir = normpath(rootdir)
    with os.scandir(rootdir) as it:
        for entry in it:
            if entry.is_dir():
                if not entry.is_symlink() or follow_links:
                    absdir = realpath(entry.path)
                    if absdir in visited: 
                        continue 
                    else: 
                        visited.add(absdir)
                    yield from scantree( entry.path, follow_links, pathjoin(reldir,entry.name) )
            else:
                yield _wrap_entry( 
                    pathjoin(reldir,entry.name), 
                    entry.path, 
                    entry.is_symlink(),
                    entry.stat().st_size )

并将其用作

for entry in scantree(rootdir, follow_links=False):
    filepath = entry.path 
    filesize = entry.size