blob: 3377d974364b8d53c78b81a967a020975fd6823a [file] [log] [blame]
Georg Brandl4c454ab2007-08-15 14:28:01 +00001
2:mod:`filecmp` --- File and Directory Comparisons
3=================================================
4
5.. module:: filecmp
6 :synopsis: Compare files efficiently.
7.. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il>
8
9
10The :mod:`filecmp` module defines functions to compare files and directories,
Mark Summerfielde0154c22007-10-19 12:48:17 +000011with various optional time/correctness trade-offs. For comparing files,
12see also the :mod:`difflib` module.
Georg Brandl4c454ab2007-08-15 14:28:01 +000013
14The :mod:`filecmp` module defines the following functions:
15
16
17.. function:: cmp(f1, f2[, shallow])
18
19 Compare the files named *f1* and *f2*, returning ``True`` if they seem equal,
20 ``False`` otherwise.
21
22 Unless *shallow* is given and is false, files with identical :func:`os.stat`
23 signatures are taken to be equal.
24
25 Files that were compared using this function will not be compared again unless
26 their :func:`os.stat` signature changes.
27
28 Note that no external programs are called from this function, giving it
29 portability and efficiency.
30
31
32.. function:: cmpfiles(dir1, dir2, common[, shallow])
33
34 Returns three lists of file names: *match*, *mismatch*, *errors*. *match*
35 contains the list of files match in both directories, *mismatch* includes the
36 names of those that don't, and *errros* lists the names of files which could not
37 be compared. Files may be listed in *errors* because the user may lack
38 permission to read them or many other reasons, but always that the comparison
39 could not be done for some reason.
40
41 The *common* parameter is a list of file names found in both directories. The
42 *shallow* parameter has the same meaning and default value as for
43 :func:`filecmp.cmp`.
44
45Example::
46
47 >>> import filecmp
48 >>> filecmp.cmp('undoc.rst', 'undoc.rst')
49 True
50 >>> filecmp.cmp('undoc.rst', 'index.rst')
51 False
52
53
54.. _dircmp-objects:
55
56The :class:`dircmp` class
57-------------------------
58
59:class:`dircmp` instances are built using this constructor:
60
61
62.. class:: dircmp(a, b[, ignore[, hide]])
63
64 Construct a new directory comparison object, to compare the directories *a* and
65 *b*. *ignore* is a list of names to ignore, and defaults to ``['RCS', 'CVS',
66 'tags']``. *hide* is a list of names to hide, and defaults to ``[os.curdir,
67 os.pardir]``.
68
Benjamin Peterson49e8c702008-04-25 01:29:10 +000069 The :class:`dircmp` class provides the following methods:
Georg Brandl4c454ab2007-08-15 14:28:01 +000070
71
Benjamin Peterson49e8c702008-04-25 01:29:10 +000072 .. method:: report()
Georg Brandl4c454ab2007-08-15 14:28:01 +000073
Benjamin Peterson49e8c702008-04-25 01:29:10 +000074 Print (to ``sys.stdout``) a comparison between *a* and *b*.
Georg Brandl4c454ab2007-08-15 14:28:01 +000075
76
Benjamin Peterson49e8c702008-04-25 01:29:10 +000077 .. method:: report_partial_closure()
Georg Brandl4c454ab2007-08-15 14:28:01 +000078
Benjamin Peterson49e8c702008-04-25 01:29:10 +000079 Print a comparison between *a* and *b* and common immediate
80 subdirectories.
Georg Brandl4c454ab2007-08-15 14:28:01 +000081
82
Benjamin Peterson49e8c702008-04-25 01:29:10 +000083 .. method:: report_full_closure()
Georg Brandl4c454ab2007-08-15 14:28:01 +000084
Benjamin Peterson49e8c702008-04-25 01:29:10 +000085 Print a comparison between *a* and *b* and common subdirectories
86 (recursively).
Georg Brandl4c454ab2007-08-15 14:28:01 +000087
Benjamin Peterson49e8c702008-04-25 01:29:10 +000088 The :class:`dircmp` offers a number of interesting attributes that may be
89 used to get various bits of information about the directory trees being
90 compared.
Georg Brandl4c454ab2007-08-15 14:28:01 +000091
Benjamin Peterson49e8c702008-04-25 01:29:10 +000092 Note that via :meth:`__getattr__` hooks, all attributes are computed lazily,
93 so there is no speed penalty if only those attributes which are lightweight
94 to compute are used.
Georg Brandl4c454ab2007-08-15 14:28:01 +000095
96
Benjamin Peterson49e8c702008-04-25 01:29:10 +000097 .. attribute:: left_list
Georg Brandl4c454ab2007-08-15 14:28:01 +000098
Benjamin Peterson49e8c702008-04-25 01:29:10 +000099 Files and subdirectories in *a*, filtered by *hide* and *ignore*.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000100
101
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000102 .. attribute:: right_list
Georg Brandl4c454ab2007-08-15 14:28:01 +0000103
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000104 Files and subdirectories in *b*, filtered by *hide* and *ignore*.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000105
106
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000107 .. attribute:: common
Georg Brandl4c454ab2007-08-15 14:28:01 +0000108
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000109 Files and subdirectories in both *a* and *b*.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000110
111
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000112 .. attribute:: left_only
Georg Brandl4c454ab2007-08-15 14:28:01 +0000113
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000114 Files and subdirectories only in *a*.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000115
116
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000117 .. attribute:: right_only
Georg Brandl4c454ab2007-08-15 14:28:01 +0000118
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000119 Files and subdirectories only in *b*.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000120
121
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000122 .. attribute:: common_dirs
Georg Brandl4c454ab2007-08-15 14:28:01 +0000123
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000124 Subdirectories in both *a* and *b*.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000125
126
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000127 .. attribute:: common_files
Georg Brandl4c454ab2007-08-15 14:28:01 +0000128
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000129 Files in both *a* and *b*
Georg Brandl4c454ab2007-08-15 14:28:01 +0000130
131
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000132 .. attribute:: common_funny
Georg Brandl4c454ab2007-08-15 14:28:01 +0000133
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000134 Names in both *a* and *b*, such that the type differs between the
135 directories, or names for which :func:`os.stat` reports an error.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000136
137
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000138 .. attribute:: same_files
Georg Brandl4c454ab2007-08-15 14:28:01 +0000139
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000140 Files which are identical in both *a* and *b*.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000141
142
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000143 .. attribute:: diff_files
Georg Brandl4c454ab2007-08-15 14:28:01 +0000144
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000145 Files which are in both *a* and *b*, whose contents differ.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000146
147
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000148 .. attribute:: funny_files
Georg Brandl4c454ab2007-08-15 14:28:01 +0000149
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000150 Files which are in both *a* and *b*, but could not be compared.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000151
152
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000153 .. attribute:: subdirs
Georg Brandl4c454ab2007-08-15 14:28:01 +0000154
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000155 A dictionary mapping names in :attr:`common_dirs` to :class:`dircmp` objects.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000156