# `filecmp` — Comparações de arquivos e diretórios

Código-fonte: Lib/filecmp.py

O módulo `filecmp` define funções para comparar arquivos e diretórios, com várias compensações opcionais de tempo/correção. Para comparar arquivos, veja também o módulo `difflib`.

O módulo `filecmp` define as seguintes funções:

filecmp.cmp(f1, f2, shallow=True)

  Compara os arquivos chamados f1 e f2, retornando `True` se eles parecerem iguais, `False` caso contrário.

  Se shallow for verdadeiro e as assinaturas de `os.stat()` (tipo de arquivo, tamanho e hora de modificação) de ambos os arquivos forem idênticas, os arquivos serão considerados iguais.

  Caso contrário, os arquivos serão tratados como diferentes se seus tamanhos ou conteúdos forem diferentes.

  Observe que nenhum programa externo é chamado a partir desta função, o que lhe confere portabilidade e eficiência.

  Esta função usa um cache para comparações passadas e os resultados, com entradas de cache invalidadas se as informações de `os.stat()` para o arquivo mudarem. O cache inteiro pode ser limpo usando `clear_cache()`.

filecmp.cmpfiles(dir1, dir2, common, shallow=True)

  Compara os arquivos nos dois diretórios dir1 e dir2 cujos nomes são dados por common.

  Retorna três listas de nomes de arquivos: match, mismatch, errors. match contém a lista de arquivos que correspondem, mismatch contém os nomes daqueles que não correspondem e errors lista os nomes dos arquivos que não puderam ser comparados. Os arquivos são listados em errors se não existirem em um dos diretórios, o usuário não tiver permissão para lê-los ou se a comparação não puder ser feita por algum outro motivo.

  O parâmetro shallow tem o mesmo significado e valor padrão que `filecmp.cmp()`.

  Por exemplo, `cmpfiles('a', 'b', ['c', 'd/e'])` comparará `a/c` com `b/c` e `a/d/e` com `b/d/e`. `'c'` e `'d/e'` estarão cada um em uma das três listas retornadas.

filecmp.clear_cache()

  Limpa o cache do filecmp. Isso pode ser útil se um arquivo for comparado tão rapidamente após ser modificado que ele esteja dentro da resolução de mtime do sistema de arquivos subjacente.

  Adicionado na versão 3.4.

## A classe `dircmp`

class filecmp.dircmp(a, b, ignore=None, hide=None)

  Constrói um novo objeto de comparação de diretórios para comparar os diretórios a e b. ignore é uma lista de nomes a serem ignorados e o padrão é `filecmp.DEFAULT_IGNORES`. hide é uma lista de nomes a serem ocultados e o padrão é `[os.curdir, os.pardir]`.

  The `dircmp` class compares files by doing shallow comparisons as described for `filecmp.cmp()`.

  A classe `dircmp` fornece os seguintes métodos:

  report()

    Exibe (para `sys.stdout`) uma comparação entre a e b.

  report_partial_closure()

    Exibe uma comparação entre a e b e subdiretórios imediatos comuns.

  report_full_closure()

    Exibe uma comparação entre a e b e subdiretórios comuns (recursivamente).

  A classe `dircmp` oferece uma série de atributos interessantes que podem ser usados para obter várias informações sobre as árvores de diretórios que estão sendo comparadas.

  Observe que, por meio dos ganchos `__getattr__()`, todos os atributos são computados preguiçosamente, portanto, não há perda de velocidade se apenas os atributos que são leves para computar forem usados.

  left

    O diretório a.

  right

    O diretório b.

  left_list

    Arquivos e subdiretórios em a, filtrados por hide e ignore.

  right_list

    Arquivos e subdiretórios em b, filtrados por hide e ignore.

  common

    Arquivos e subdiretórios em a e b.

  left_only

    Arquivos e subdiretórios em apenas a.

  right_only

    Arquivos e subdiretórios em apenas b.

  common_dirs

    Subdiretórios em a e b.

  common_files

    Arquivos em a e b.

  common_funny

    Nomes em a e b, de modo que o tipo difere entre os diretórios, ou nomes para os quais `os.stat()` relata um erro.

  same_files

    Arquivos que são idênticos em a e b, usando o operador de comparação de arquivos da classe.

  diff_files

    Arquivos que estão em a e b, cujos conteúdos diferem de acordo com o operador de comparação de arquivos da classe.

  funny_files

    Arquivos que estão em a e b, mas não puderam ser comparados.

  subdirs

    Um dicionário que mapeia nomes em `common_dirs` para instâncias `dircmp` (ou instâncias MyDirCmp se esta instância for do tipo MyDirCmp, uma subclasse de `dircmp`).

    Alterado na versão 3.10: Anteriormente, as entradas eram sempre instâncias de `dircmp`. Agora, as entradas são do mesmo tipo que self, se self for uma subclasse de `dircmp`.

filecmp.DEFAULT_IGNORES

  Adicionado na versão 3.4.

  Lista de diretórios ignorados por `dircmp` por padrão.

Aqui está um exemplo simplificado do uso do atributo `subdirs` para pesquisar recursivamente em dois diretórios para mostrar arquivos diferentes em comum:

    >>> from filecmp import dircmp
    >>> def print_diff_files(dcmp):
    ...     for name in dcmp.diff_files:
    ...         print("diff_file %s found in %s and %s" % (name, dcmp.left,
    ...               dcmp.right))
    ...     for sub_dcmp in dcmp.subdirs.values():
    ...         print_diff_files(sub_dcmp)
    ...
    >>> dcmp = dircmp('dir1', 'dir2')
    >>> print_diff_files(dcmp)