What exactly does a non-shallow filecmp.cmp do?
Asked Answered
S

1

13

I'm using Python 2.6.2. The docs for the filecmp module say:

The filecmp module defines functions to compare files and directories, with various optional time/correctness trade-offs.

and, of the filecmp.cmp function:

filecmp.cmp(f1, f2[, shallow])

Compare the files named f1 and f2, returning True if they seem equal, False otherwise.

Unless shallow is given and is false, files with identical os.stat() signatures are taken to be equal.

What they don't do is specify just what is the correctness level one obtains with shallow=False. So, what does shallow=False do? How correct is it?

Springy answered 6/8, 2010 at 6:38 Comment(0)
S
14

Consulting the source filecmp.py reveals that if shallow=False, filecmp.cmp first checks a few select properties of os.stat(), regardless of whether shallow is True or False. If the stat properties that are examined are the same, it returns True. Else, it checks its internal cache to see if the files have already been compared earlier. If it has, it returns True. Else, it reads BUFSIZE = 8*1024 chunks of data from both files and does an exact contents comparison until it reaches the end of the file. It returns True if the two files have exactly the same contents.

Springy answered 6/8, 2010 at 6:38 Comment(5)
I have recently clarified this in the official documentation of Python 3.3Highlight
How and when will one need to do a 'shallow comparison' between two files? The only difference of this would be it also regard 'mode mtime size' equality as file equality, well, but this doesn't make much sense to me.Ushas
@RobertBean It saves you a lot of processing time. I think they determined that most of the time files with identical signatures are in fact identical.Diffusive
@Diffusive Since the os.stat includes inode number, then os.stat would only be the same if the files are hardlinks, correct? (Though this may vary with filesystem, and os.stat follows symlinks?)Delmore
for non-shallow mode, why not compute hash of both files and compare? Won't that be fasterGuertin

© 2022 - 2024 — McMap. All rights reserved.