在os.walk中获取文件大小
我正在使用 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
# ...