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