17db96d56Sopenharmony_ci:mod:`filecmp` --- File and Directory Comparisons 27db96d56Sopenharmony_ci================================================= 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci.. module:: filecmp 57db96d56Sopenharmony_ci :synopsis: Compare files efficiently. 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci.. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il> 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ci**Source code:** :source:`Lib/filecmp.py` 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci-------------- 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ciThe :mod:`filecmp` module defines functions to compare files and directories, 147db96d56Sopenharmony_ciwith various optional time/correctness trade-offs. For comparing files, 157db96d56Sopenharmony_cisee also the :mod:`difflib` module. 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_ciThe :mod:`filecmp` module defines the following functions: 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci.. function:: cmp(f1, f2, shallow=True) 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci Compare the files named *f1* and *f2*, returning ``True`` if they seem equal, 237db96d56Sopenharmony_ci ``False`` otherwise. 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_ci If *shallow* is true and the :func:`os.stat` signatures (file type, size, and 267db96d56Sopenharmony_ci modification time) of both files are identical, the files are taken to be 277db96d56Sopenharmony_ci equal. 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_ci Otherwise, the files are treated as different if their sizes or contents differ. 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci Note that no external programs are called from this function, giving it 327db96d56Sopenharmony_ci portability and efficiency. 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ci This function uses a cache for past comparisons and the results, 357db96d56Sopenharmony_ci with cache entries invalidated if the :func:`os.stat` information for the 367db96d56Sopenharmony_ci file changes. The entire cache may be cleared using :func:`clear_cache`. 377db96d56Sopenharmony_ci 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ci.. function:: cmpfiles(dir1, dir2, common, shallow=True) 407db96d56Sopenharmony_ci 417db96d56Sopenharmony_ci Compare the files in the two directories *dir1* and *dir2* whose names are 427db96d56Sopenharmony_ci given by *common*. 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_ci Returns three lists of file names: *match*, *mismatch*, 457db96d56Sopenharmony_ci *errors*. *match* contains the list of files that match, *mismatch* contains 467db96d56Sopenharmony_ci the names of those that don't, and *errors* lists the names of files which 477db96d56Sopenharmony_ci could not be compared. Files are listed in *errors* if they don't exist in 487db96d56Sopenharmony_ci one of the directories, the user lacks permission to read them or if the 497db96d56Sopenharmony_ci comparison could not be done for some other reason. 507db96d56Sopenharmony_ci 517db96d56Sopenharmony_ci The *shallow* parameter has the same meaning and default value as for 527db96d56Sopenharmony_ci :func:`filecmp.cmp`. 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci For example, ``cmpfiles('a', 'b', ['c', 'd/e'])`` will compare ``a/c`` with 557db96d56Sopenharmony_ci ``b/c`` and ``a/d/e`` with ``b/d/e``. ``'c'`` and ``'d/e'`` will each be in 567db96d56Sopenharmony_ci one of the three returned lists. 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci.. function:: clear_cache() 607db96d56Sopenharmony_ci 617db96d56Sopenharmony_ci Clear the filecmp cache. This may be useful if a file is compared so quickly 627db96d56Sopenharmony_ci after it is modified that it is within the mtime resolution of 637db96d56Sopenharmony_ci the underlying filesystem. 647db96d56Sopenharmony_ci 657db96d56Sopenharmony_ci .. versionadded:: 3.4 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_ci 687db96d56Sopenharmony_ci.. _dircmp-objects: 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ciThe :class:`dircmp` class 717db96d56Sopenharmony_ci------------------------- 727db96d56Sopenharmony_ci 737db96d56Sopenharmony_ci.. class:: dircmp(a, b, ignore=None, hide=None) 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ci Construct a new directory comparison object, to compare the directories *a* 767db96d56Sopenharmony_ci and *b*. *ignore* is a list of names to ignore, and defaults to 777db96d56Sopenharmony_ci :attr:`filecmp.DEFAULT_IGNORES`. *hide* is a list of names to hide, and 787db96d56Sopenharmony_ci defaults to ``[os.curdir, os.pardir]``. 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ci The :class:`dircmp` class compares files by doing *shallow* comparisons 817db96d56Sopenharmony_ci as described for :func:`filecmp.cmp`. 827db96d56Sopenharmony_ci 837db96d56Sopenharmony_ci The :class:`dircmp` class provides the following methods: 847db96d56Sopenharmony_ci 857db96d56Sopenharmony_ci .. method:: report() 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_ci Print (to :data:`sys.stdout`) a comparison between *a* and *b*. 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ci .. method:: report_partial_closure() 907db96d56Sopenharmony_ci 917db96d56Sopenharmony_ci Print a comparison between *a* and *b* and common immediate 927db96d56Sopenharmony_ci subdirectories. 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ci .. method:: report_full_closure() 957db96d56Sopenharmony_ci 967db96d56Sopenharmony_ci Print a comparison between *a* and *b* and common subdirectories 977db96d56Sopenharmony_ci (recursively). 987db96d56Sopenharmony_ci 997db96d56Sopenharmony_ci The :class:`dircmp` class offers a number of interesting attributes that may be 1007db96d56Sopenharmony_ci used to get various bits of information about the directory trees being 1017db96d56Sopenharmony_ci compared. 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci Note that via :meth:`__getattr__` hooks, all attributes are computed lazily, 1047db96d56Sopenharmony_ci so there is no speed penalty if only those attributes which are lightweight 1057db96d56Sopenharmony_ci to compute are used. 1067db96d56Sopenharmony_ci 1077db96d56Sopenharmony_ci 1087db96d56Sopenharmony_ci .. attribute:: left 1097db96d56Sopenharmony_ci 1107db96d56Sopenharmony_ci The directory *a*. 1117db96d56Sopenharmony_ci 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci .. attribute:: right 1147db96d56Sopenharmony_ci 1157db96d56Sopenharmony_ci The directory *b*. 1167db96d56Sopenharmony_ci 1177db96d56Sopenharmony_ci 1187db96d56Sopenharmony_ci .. attribute:: left_list 1197db96d56Sopenharmony_ci 1207db96d56Sopenharmony_ci Files and subdirectories in *a*, filtered by *hide* and *ignore*. 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ci 1237db96d56Sopenharmony_ci .. attribute:: right_list 1247db96d56Sopenharmony_ci 1257db96d56Sopenharmony_ci Files and subdirectories in *b*, filtered by *hide* and *ignore*. 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ci 1287db96d56Sopenharmony_ci .. attribute:: common 1297db96d56Sopenharmony_ci 1307db96d56Sopenharmony_ci Files and subdirectories in both *a* and *b*. 1317db96d56Sopenharmony_ci 1327db96d56Sopenharmony_ci 1337db96d56Sopenharmony_ci .. attribute:: left_only 1347db96d56Sopenharmony_ci 1357db96d56Sopenharmony_ci Files and subdirectories only in *a*. 1367db96d56Sopenharmony_ci 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ci .. attribute:: right_only 1397db96d56Sopenharmony_ci 1407db96d56Sopenharmony_ci Files and subdirectories only in *b*. 1417db96d56Sopenharmony_ci 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_ci .. attribute:: common_dirs 1447db96d56Sopenharmony_ci 1457db96d56Sopenharmony_ci Subdirectories in both *a* and *b*. 1467db96d56Sopenharmony_ci 1477db96d56Sopenharmony_ci 1487db96d56Sopenharmony_ci .. attribute:: common_files 1497db96d56Sopenharmony_ci 1507db96d56Sopenharmony_ci Files in both *a* and *b*. 1517db96d56Sopenharmony_ci 1527db96d56Sopenharmony_ci 1537db96d56Sopenharmony_ci .. attribute:: common_funny 1547db96d56Sopenharmony_ci 1557db96d56Sopenharmony_ci Names in both *a* and *b*, such that the type differs between the 1567db96d56Sopenharmony_ci directories, or names for which :func:`os.stat` reports an error. 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_ci 1597db96d56Sopenharmony_ci .. attribute:: same_files 1607db96d56Sopenharmony_ci 1617db96d56Sopenharmony_ci Files which are identical in both *a* and *b*, using the class's 1627db96d56Sopenharmony_ci file comparison operator. 1637db96d56Sopenharmony_ci 1647db96d56Sopenharmony_ci 1657db96d56Sopenharmony_ci .. attribute:: diff_files 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ci Files which are in both *a* and *b*, whose contents differ according 1687db96d56Sopenharmony_ci to the class's file comparison operator. 1697db96d56Sopenharmony_ci 1707db96d56Sopenharmony_ci 1717db96d56Sopenharmony_ci .. attribute:: funny_files 1727db96d56Sopenharmony_ci 1737db96d56Sopenharmony_ci Files which are in both *a* and *b*, but could not be compared. 1747db96d56Sopenharmony_ci 1757db96d56Sopenharmony_ci 1767db96d56Sopenharmony_ci .. attribute:: subdirs 1777db96d56Sopenharmony_ci 1787db96d56Sopenharmony_ci A dictionary mapping names in :attr:`common_dirs` to :class:`dircmp` 1797db96d56Sopenharmony_ci instances (or MyDirCmp instances if this instance is of type MyDirCmp, a 1807db96d56Sopenharmony_ci subclass of :class:`dircmp`). 1817db96d56Sopenharmony_ci 1827db96d56Sopenharmony_ci .. versionchanged:: 3.10 1837db96d56Sopenharmony_ci Previously entries were always :class:`dircmp` instances. Now entries 1847db96d56Sopenharmony_ci are the same type as *self*, if *self* is a subclass of 1857db96d56Sopenharmony_ci :class:`dircmp`. 1867db96d56Sopenharmony_ci 1877db96d56Sopenharmony_ci.. attribute:: DEFAULT_IGNORES 1887db96d56Sopenharmony_ci 1897db96d56Sopenharmony_ci .. versionadded:: 3.4 1907db96d56Sopenharmony_ci 1917db96d56Sopenharmony_ci List of directories ignored by :class:`dircmp` by default. 1927db96d56Sopenharmony_ci 1937db96d56Sopenharmony_ci 1947db96d56Sopenharmony_ciHere is a simplified example of using the ``subdirs`` attribute to search 1957db96d56Sopenharmony_cirecursively through two directories to show common different files:: 1967db96d56Sopenharmony_ci 1977db96d56Sopenharmony_ci >>> from filecmp import dircmp 1987db96d56Sopenharmony_ci >>> def print_diff_files(dcmp): 1997db96d56Sopenharmony_ci ... for name in dcmp.diff_files: 2007db96d56Sopenharmony_ci ... print("diff_file %s found in %s and %s" % (name, dcmp.left, 2017db96d56Sopenharmony_ci ... dcmp.right)) 2027db96d56Sopenharmony_ci ... for sub_dcmp in dcmp.subdirs.values(): 2037db96d56Sopenharmony_ci ... print_diff_files(sub_dcmp) 2047db96d56Sopenharmony_ci ... 2057db96d56Sopenharmony_ci >>> dcmp = dircmp('dir1', 'dir2') # doctest: +SKIP 2067db96d56Sopenharmony_ci >>> print_diff_files(dcmp) # doctest: +SKIP 2077db96d56Sopenharmony_ci 208