blob: f9c5fb16a3049e0e5f49fd0da980a4eb50107ff8 [file] [log] [blame]
Georg Brandl4c454ab2007-08-15 14:28:01 +00001:mod:`filecmp` --- File and Directory Comparisons
2=================================================
3
4.. module:: filecmp
5 :synopsis: Compare files efficiently.
6.. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il>
7
Éric Araujob30f19f2011-08-19 02:14:03 +02008**Source code:** :source:`Lib/filecmp.py`
9
10--------------
Georg Brandl4c454ab2007-08-15 14:28:01 +000011
12The :mod:`filecmp` module defines functions to compare files and directories,
Mark Summerfielde0154c22007-10-19 12:48:17 +000013with various optional time/correctness trade-offs. For comparing files,
14see also the :mod:`difflib` module.
Georg Brandl4c454ab2007-08-15 14:28:01 +000015
16The :mod:`filecmp` module defines the following functions:
17
18
19.. function:: cmp(f1, f2[, shallow])
20
21 Compare the files named *f1* and *f2*, returning ``True`` if they seem equal,
22 ``False`` otherwise.
23
24 Unless *shallow* is given and is false, files with identical :func:`os.stat`
25 signatures are taken to be equal.
26
27 Files that were compared using this function will not be compared again unless
28 their :func:`os.stat` signature changes.
29
30 Note that no external programs are called from this function, giving it
31 portability and efficiency.
32
33
34.. function:: cmpfiles(dir1, dir2, common[, shallow])
35
Georg Brandlcf4f2382009-02-27 16:39:26 +000036 Compare the files in the two directories *dir1* and *dir2* whose names are
37 given by *common*.
Georg Brandl4c454ab2007-08-15 14:28:01 +000038
Georg Brandlcf4f2382009-02-27 16:39:26 +000039 Returns three lists of file names: *match*, *mismatch*,
40 *errors*. *match* contains the list of files that match, *mismatch* contains
41 the names of those that don't, and *errors* lists the names of files which
42 could not be compared. Files are listed in *errors* if they don't exist in
43 one of the directories, the user lacks permission to read them or if the
44 comparison could not be done for some other reason.
45
46 The *shallow* parameter has the same meaning and default value as for
Georg Brandl4c454ab2007-08-15 14:28:01 +000047 :func:`filecmp.cmp`.
48
Georg Brandlcf4f2382009-02-27 16:39:26 +000049 For example, ``cmpfiles('a', 'b', ['c', 'd/e'])`` will compare ``a/c`` with
50 ``b/c`` and ``a/d/e`` with ``b/d/e``. ``'c'`` and ``'d/e'`` will each be in
51 one of the three returned lists.
52
53
Georg Brandl4c454ab2007-08-15 14:28:01 +000054Example::
55
56 >>> import filecmp
Ezio Melotticfd85a72013-01-11 08:53:10 +020057 >>> filecmp.cmp('undoc.rst', 'undoc.rst') # doctest: +SKIP
Georg Brandl4c454ab2007-08-15 14:28:01 +000058 True
Ezio Melotticfd85a72013-01-11 08:53:10 +020059 >>> filecmp.cmp('undoc.rst', 'index.rst') # doctest: +SKIP
Georg Brandl4c454ab2007-08-15 14:28:01 +000060 False
61
62
63.. _dircmp-objects:
64
65The :class:`dircmp` class
66-------------------------
67
68:class:`dircmp` instances are built using this constructor:
69
70
71.. class:: dircmp(a, b[, ignore[, hide]])
72
73 Construct a new directory comparison object, to compare the directories *a* and
74 *b*. *ignore* is a list of names to ignore, and defaults to ``['RCS', 'CVS',
75 'tags']``. *hide* is a list of names to hide, and defaults to ``[os.curdir,
76 os.pardir]``.
77
Senthil Kumaran8935c912012-07-22 19:36:03 -070078 The :class:`dircmp` class compares files by doing *shallow* comparisons
79 as described for :func:`filecmp.cmp`.
80
Benjamin Peterson49e8c702008-04-25 01:29:10 +000081 The :class:`dircmp` class provides the following methods:
Georg Brandl4c454ab2007-08-15 14:28:01 +000082
83
Benjamin Peterson49e8c702008-04-25 01:29:10 +000084 .. method:: report()
Georg Brandl4c454ab2007-08-15 14:28:01 +000085
Benjamin Peterson49e8c702008-04-25 01:29:10 +000086 Print (to ``sys.stdout``) a comparison between *a* and *b*.
Georg Brandl4c454ab2007-08-15 14:28:01 +000087
88
Benjamin Peterson49e8c702008-04-25 01:29:10 +000089 .. method:: report_partial_closure()
Georg Brandl4c454ab2007-08-15 14:28:01 +000090
Benjamin Peterson49e8c702008-04-25 01:29:10 +000091 Print a comparison between *a* and *b* and common immediate
92 subdirectories.
Georg Brandl4c454ab2007-08-15 14:28:01 +000093
94
Benjamin Peterson49e8c702008-04-25 01:29:10 +000095 .. method:: report_full_closure()
Georg Brandl4c454ab2007-08-15 14:28:01 +000096
Benjamin Peterson49e8c702008-04-25 01:29:10 +000097 Print a comparison between *a* and *b* and common subdirectories
98 (recursively).
Georg Brandl4c454ab2007-08-15 14:28:01 +000099
Senthil Kumaran8935c912012-07-22 19:36:03 -0700100 The :class:`dircmp` class offers a number of interesting attributes that may be
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000101 used to get various bits of information about the directory trees being
102 compared.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000103
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000104 Note that via :meth:`__getattr__` hooks, all attributes are computed lazily,
105 so there is no speed penalty if only those attributes which are lightweight
106 to compute are used.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000107
108
R David Murrayd5fef652012-08-14 21:50:38 -0400109 .. attribute:: left
110
111 The directory *a*.
112
113
114 .. attribute:: right
115
116 The directory *b*.
117
118
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000119 .. attribute:: left_list
Georg Brandl4c454ab2007-08-15 14:28:01 +0000120
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000121 Files and subdirectories in *a*, filtered by *hide* and *ignore*.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000122
123
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000124 .. attribute:: right_list
Georg Brandl4c454ab2007-08-15 14:28:01 +0000125
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000126 Files and subdirectories in *b*, filtered by *hide* and *ignore*.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000127
128
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000129 .. attribute:: common
Georg Brandl4c454ab2007-08-15 14:28:01 +0000130
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000131 Files and subdirectories in both *a* and *b*.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000132
133
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000134 .. attribute:: left_only
Georg Brandl4c454ab2007-08-15 14:28:01 +0000135
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000136 Files and subdirectories only in *a*.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000137
138
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000139 .. attribute:: right_only
Georg Brandl4c454ab2007-08-15 14:28:01 +0000140
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000141 Files and subdirectories only in *b*.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000142
143
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000144 .. attribute:: common_dirs
Georg Brandl4c454ab2007-08-15 14:28:01 +0000145
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000146 Subdirectories in both *a* and *b*.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000147
148
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000149 .. attribute:: common_files
Georg Brandl4c454ab2007-08-15 14:28:01 +0000150
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000151 Files in both *a* and *b*
Georg Brandl4c454ab2007-08-15 14:28:01 +0000152
153
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000154 .. attribute:: common_funny
Georg Brandl4c454ab2007-08-15 14:28:01 +0000155
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000156 Names in both *a* and *b*, such that the type differs between the
157 directories, or names for which :func:`os.stat` reports an error.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000158
159
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000160 .. attribute:: same_files
Georg Brandl4c454ab2007-08-15 14:28:01 +0000161
Senthil Kumaran8935c912012-07-22 19:36:03 -0700162 Files which are identical in both *a* and *b*, using the class's
163 file comparison operator.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000164
165
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000166 .. attribute:: diff_files
Georg Brandl4c454ab2007-08-15 14:28:01 +0000167
Senthil Kumaran8935c912012-07-22 19:36:03 -0700168 Files which are in both *a* and *b*, whose contents differ according
169 to the class's file comparison operator.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000170
171
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000172 .. attribute:: funny_files
Georg Brandl4c454ab2007-08-15 14:28:01 +0000173
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000174 Files which are in both *a* and *b*, but could not be compared.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000175
176
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000177 .. attribute:: subdirs
Georg Brandl4c454ab2007-08-15 14:28:01 +0000178
Benjamin Peterson49e8c702008-04-25 01:29:10 +0000179 A dictionary mapping names in :attr:`common_dirs` to :class:`dircmp` objects.
Georg Brandl4c454ab2007-08-15 14:28:01 +0000180
R David Murrayd5fef652012-08-14 21:50:38 -0400181
182Here is a simplified example of using the ``subdirs`` attribute to search
183recursively through two directories to show common different files::
184
185 >>> from filecmp import dircmp
186 >>> def print_diff_files(dcmp):
187 ... for name in dcmp.diff_files:
188 ... print "diff_file %s found in %s and %s" % (name, dcmp.left,
189 ... dcmp.right)
190 ... for sub_dcmp in dcmp.subdirs.values():
191 ... print_diff_files(sub_dcmp)
192 ...
Ezio Melotticfd85a72013-01-11 08:53:10 +0200193 >>> dcmp = dircmp('dir1', 'dir2') # doctest: +SKIP
194 >>> print_diff_files(dcmp) # doctest: +SKIP
R David Murrayd5fef652012-08-14 21:50:38 -0400195