在os.walk中获取文件大小

5 投票
4 回答
13058 浏览
提问于 2025-04-16 21:59

我正在使用 os.walk 来比较两个文件夹,看看它们里面的文件是否完全一样。不过,这个方法只检查文件名。我想确保文件的大小也一样,如果不一样的话要能报告出来。请问可以通过 os.walk 获取文件大小吗?

4 个回答

2

顺便说一下,Python 3中有一个更高效的解决方案

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
from os.path import normpath, realpath
from os.path import join as pathjoin

_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
2

os.path.getsize(path) 这个函数可以告诉你文件的大小,但两个文件大小相同并不一定意味着它们是完全一样的。你可以读取文件的内容,然后生成一个 MD5 值或者哈希值来进行比较。

11

你可以通过使用 os.stat 来获取文件大小,而不需要用 os.walk。只要记得把文件路径和根目录连接起来就可以了:

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

        # ...

撰写回答