Psyduck - 可達鴨 之 鴨力山大2


Server : LiteSpeed
System : Linux premium217.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User : alloknri ( 880)
PHP Version : 8.1.34
Disable Function : NONE
Directory :  /usr/lib64/python3.8/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //usr/lib64/python3.8/filecmp.py
"""Utilities for comparing files and directories.

Classes:
    dircmp

Functions:
    cmp(f1, f2, shallow=True) -> int
    cmpfiles(a, b, common) -> ([], [], [])
    clear_cache()

"""

import os
import stat
from itertools import filterfalse

__all__ = ['clear_cache', 'cmp', 'dircmp', 'cmpfiles', 'DEFAULT_IGNORES']

_cache = {}
BUFSIZE = 8*1024

DEFAULT_IGNORES = [
    'RCS', 'CVS', 'tags', '.git', '.hg', '.bzr', '_darcs', '__pycache__']

def clear_cache():
    """Clear the filecmp cache."""
    _cache.clear()

def cmp(f1, f2, shallow=True):
    """Compare two files.

    Arguments:

    f1 -- First file name

    f2 -- Second file name

    shallow -- Just check stat signature (do not read the files).
               defaults to True.

    Return value:

    True if the files are the same, False otherwise.

    This function uses a cache for past comparisons and the results,
    with cache entries invalidated if their stat information
    changes.  The cache may be cleared by calling clear_cache().

    """

    s1 = _sig(os.stat(f1))
    s2 = _sig(os.stat(f2))
    if s1[0] != stat.S_IFREG or s2[0] != stat.S_IFREG:
        return False
    if shallow and s1 == s2:
        return True
    if s1[1] != s2[1]:
        return False

    outcome = _cache.get((f1, f2, s1, s2))
    if outcome is None:
        outcome = _do_cmp(f1, f2)
        if len(_cache) > 100:      # limit the maximum size of the cache
            clear_cache()
        _cache[f1, f2, s1, s2] = outcome
    return outcome

def _sig(st):
    return (stat.S_IFMT(st.st_mode),
            st.st_size,
            st.st_mtime)

def _do_cmp(f1, f2):
    bufsize = BUFSIZE
    with open(f1, 'rb') as fp1, open(f2, 'rb') as fp2:
        while True:
            b1 = fp1.read(bufsize)
            b2 = fp2.read(bufsize)
            if b1 != b2:
                return False
            if not b1:
                return True

# Directory comparison class.
#
class dircmp:
    """A class that manages the comparison of 2 directories.

    dircmp(a, b, ignore=None, hide=None)
      A and B are directories.
      IGNORE is a list of names to ignore,
        defaults to DEFAULT_IGNORES.
      HIDE is a list of names to hide,
        defaults to [os.curdir, os.pardir].

    High level usage:
      x = dircmp(dir1, dir2)
      x.report() -> prints a report on the differences between dir1 and dir2
       or
      x.report_partial_closure() -> prints report on differences between dir1
            and dir2, and reports on common immediate subdirectories.
      x.report_full_closure() -> like report_partial_closure,
            but fully recursive.

    Attributes:
     left_list, right_list: The files in dir1 and dir2,
        filtered by hide and ignore.
     common: a list of names in both dir1 and dir2.
     left_only, right_only: names only in dir1, dir2.
     common_dirs: subdirectories in both dir1 and dir2.
     common_files: files in both dir1 and dir2.
     common_funny: names in both dir1 and dir2 where the type differs between
        dir1 and dir2, or the name is not stat-able.
     same_files: list of identical files.
     diff_files: list of filenames which differ.
     funny_files: list of files which could not be compared.
     subdirs: a dictionary of dircmp objects, keyed by names in common_dirs.
     """

    def __init__(self, a, b, ignore=None, hide=None): # Initialize
        self.left = a
        self.right = b
        if hide is None:
            self.hide = [os.curdir, os.pardir] # Names never to be shown
        else:
            self.hide = hide
        if ignore is None:
            self.ignore = DEFAULT_IGNORES
        else:
            self.ignore = ignore

    def phase0(self): # Compare everything except common subdirectories
        self.left_list = _filter(os.listdir(self.left),
                                 self.hide+self.ignore)
        self.right_list = _filter(os.listdir(self.right),
                                  self.hide+self.ignore)
        self.left_list.sort()
        self.right_list.sort()

    def phase1(self): # Compute common names
        a = dict(zip(map(os.path.normcase, self.left_list), self.left_list))
        b = dict(zip(map(os.path.normcase, self.right_list), self.right_list))
        self.common = list(map(a.__getitem__, filter(b.__contains__, a)))
        self.left_only = list(map(a.__getitem__, filterfalse(b.__contains__, a)))
        self.right_only = list(map(b.__getitem__, filterfalse(a.__contains__, b)))

    def phase2(self): # Distinguish files, directories, funnies
        self.common_dirs = []
        self.common_files = []
        self.common_funny = []

        for x in self.common:
            a_path = os.path.join(self.left, x)
            b_path = os.path.join(self.right, x)

            ok = 1
            try:
                a_stat = os.stat(a_path)
            except OSError as why:
                # print('Can\'t stat', a_path, ':', why.args[1])
                ok = 0
            try:
                b_stat = os.stat(b_path)
            except OSError as why:
                # print('Can\'t stat', b_path, ':', why.args[1])
                ok = 0

            if ok:
                a_type = stat.S_IFMT(a_stat.st_mode)
                b_type = stat.S_IFMT(b_stat.st_mode)
                if a_type != b_type:
                    self.common_funny.append(x)
                elif stat.S_ISDIR(a_type):
                    self.common_dirs.append(x)
                elif stat.S_ISREG(a_type):
                    self.common_files.append(x)
                else:
                    self.common_funny.append(x)
            else:
                self.common_funny.append(x)

    def phase3(self): # Find out differences between common files
        xx = cmpfiles(self.left, self.right, self.common_files)
        self.same_files, self.diff_files, self.funny_files = xx

    def phase4(self): # Find out differences between common subdirectories
        # A new dircmp object is created for each common subdirectory,
        # these are stored in a dictionary indexed by filename.
        # The hide and ignore properties are inherited from the parent
        self.subdirs = {}
        for x in self.common_dirs:
            a_x = os.path.join(self.left, x)
            b_x = os.path.join(self.right, x)
            self.subdirs[x]  = dircmp(a_x, b_x, self.ignore, self.hide)

    def phase4_closure(self): # Recursively call phase4() on subdirectories
        self.phase4()
        for sd in self.subdirs.values():
            sd.phase4_closure()

    def report(self): # Print a report on the differences between a and b
        # Output format is purposely lousy
        print('diff', self.left, self.right)
        if self.left_only:
            self.left_only.sort()
            print('Only in', self.left, ':', self.left_only)
        if self.right_only:
            self.right_only.sort()
            print('Only in', self.right, ':', self.right_only)
        if self.same_files:
            self.same_files.sort()
            print('Identical files :', self.same_files)
        if self.diff_files:
            self.diff_files.sort()
            print('Differing files :', self.diff_files)
        if self.funny_files:
            self.funny_files.sort()
            print('Trouble with common files :', self.funny_files)
        if self.common_dirs:
            self.common_dirs.sort()
            print('Common subdirectories :', self.common_dirs)
        if self.common_funny:
            self.common_funny.sort()
            print('Common funny cases :', self.common_funny)

    def report_partial_closure(self): # Print reports on self and on subdirs
        self.report()
        for sd in self.subdirs.values():
            print()
            sd.report()

    def report_full_closure(self): # Report on self and subdirs recursively
        self.report()
        for sd in self.subdirs.values():
            print()
            sd.report_full_closure()

    methodmap = dict(subdirs=phase4,
                     same_files=phase3, diff_files=phase3, funny_files=phase3,
                     common_dirs = phase2, common_files=phase2, common_funny=phase2,
                     common=phase1, left_only=phase1, right_only=phase1,
                     left_list=phase0, right_list=phase0)

    def __getattr__(self, attr):
        if attr not in self.methodmap:
            raise AttributeError(attr)
        self.methodmap[attr](self)
        return getattr(self, attr)

def cmpfiles(a, b, common, shallow=True):
    """Compare common files in two directories.

    a, b -- directory names
    common -- list of file names found in both directories
    shallow -- if true, do comparison based solely on stat() information

    Returns a tuple of three lists:
      files that compare equal
      files that are different
      filenames that aren't regular files.

    """
    res = ([], [], [])
    for x in common:
        ax = os.path.join(a, x)
        bx = os.path.join(b, x)
        res[_cmp(ax, bx, shallow)].append(x)
    return res


# Compare two files.
# Return:
#       0 for equal
#       1 for different
#       2 for funny cases (can't stat, etc.)
#
def _cmp(a, b, sh, abs=abs, cmp=cmp):
    try:
        return not abs(cmp(a, b, sh))
    except OSError:
        return 2


# Return a copy with items that occur in skip removed.
#
def _filter(flist, skip):
    return list(filterfalse(skip.__contains__, flist))


# Demonstration and testing.
#
def demo():
    import sys
    import getopt
    options, args = getopt.getopt(sys.argv[1:], 'r')
    if len(args) != 2:
        raise getopt.GetoptError('need exactly two args', None)
    dd = dircmp(args[0], args[1])
    if ('-r', '') in options:
        dd.report_full_closure()
    else:
        dd.report()

if __name__ == '__main__':
    demo()
Name
Size
Permissions
Options
__pycache__
--
drwxr-xr-x
asyncio
--
drwxr-xr-x
collections
--
drwxr-xr-x
concurrent
--
drwxr-xr-x
config-3.8-x86_64-linux-gnu
--
drwxr-xr-x
ctypes
--
drwxr-xr-x
curses
--
drwxr-xr-x
dbm
--
drwxr-xr-x
distutils
--
drwxr-xr-x
email
--
drwxr-xr-x
encodings
--
drwxr-xr-x
ensurepip
--
drwxr-xr-x
html
--
drwxr-xr-x
http
--
drwxr-xr-x
importlib
--
drwxr-xr-x
json
--
drwxr-xr-x
lib-dynload
--
drwxr-xr-x
lib2to3
--
drwxr-xr-x
logging
--
drwxr-xr-x
multiprocessing
--
drwxr-xr-x
pydoc_data
--
drwxr-xr-x
site-packages
--
drwxr-xr-x
sqlite3
--
drwxr-xr-x
tkinter
--
drwxr-xr-x
turtledemo
--
drwxr-xr-x
unittest
--
drwxr-xr-x
urllib
--
drwxr-xr-x
venv
--
drwxr-xr-x
wsgiref
--
drwxr-xr-x
xml
--
drwxr-xr-x
xmlrpc
--
drwxr-xr-x
LICENSE.txt
13.61 KB
-rw-r--r--
__future__.py
5.026 KB
-rw-r--r--
__phello__.foo.py
0.063 KB
-rw-r--r--
_bootlocale.py
1.759 KB
-rw-r--r--
_collections_abc.py
25.488 KB
-rw-r--r--
_compat_pickle.py
8.544 KB
-rw-r--r--
_compression.py
5.215 KB
-rw-r--r--
_dummy_thread.py
5.886 KB
-rw-r--r--
_markupbase.py
14.256 KB
-rw-r--r--
_osx_support.py
21.264 KB
-rw-r--r--
_py_abc.py
6.044 KB
-rw-r--r--
_pydecimal.py
223.307 KB
-rw-r--r--
_pyio.py
90.993 KB
-rw-r--r--
_sitebuiltins.py
3.042 KB
-rw-r--r--
_strptime.py
24.676 KB
-rw-r--r--
_sysconfigdata__linux_x86_64-linux-gnu.py
37.607 KB
-rw-r--r--
_sysconfigdata_d_linux_x86_64-linux-gnu.py
37.341 KB
-rw-r--r--
_threading_local.py
7.051 KB
-rw-r--r--
_weakrefset.py
5.601 KB
-rw-r--r--
abc.py
4.384 KB
-rw-r--r--
aifc.py
32.045 KB
-rw-r--r--
antigravity.py
0.466 KB
-rw-r--r--
argparse.py
93.765 KB
-rw-r--r--
ast.py
18.783 KB
-rw-r--r--
asynchat.py
11.063 KB
-rw-r--r--
asyncore.py
19.623 KB
-rw-r--r--
base64.py
19.904 KB
-rwxr-xr-x
bdb.py
31.305 KB
-rw-r--r--
binhex.py
13.627 KB
-rw-r--r--
bisect.py
2.162 KB
-rw-r--r--
bz2.py
12.264 KB
-rw-r--r--
cProfile.py
6.846 KB
-rwxr-xr-x
calendar.py
24.25 KB
-rw-r--r--
cgi.py
33.139 KB
-rwxr-xr-x
cgitb.py
11.813 KB
-rw-r--r--
chunk.py
5.308 KB
-rw-r--r--
cmd.py
14.512 KB
-rw-r--r--
code.py
10.373 KB
-rw-r--r--
codecs.py
35.808 KB
-rw-r--r--
codeop.py
6.182 KB
-rw-r--r--
colorsys.py
3.969 KB
-rw-r--r--
compileall.py
13.357 KB
-rw-r--r--
configparser.py
53.1 KB
-rw-r--r--
contextlib.py
24.409 KB
-rw-r--r--
contextvars.py
0.126 KB
-rw-r--r--
copy.py
8.458 KB
-rw-r--r--
copyreg.py
6.968 KB
-rw-r--r--
crypt.py
3.525 KB
-rw-r--r--
csv.py
15.766 KB
-rw-r--r--
dataclasses.py
48.802 KB
-rw-r--r--
datetime.py
86.218 KB
-rw-r--r--
decimal.py
0.313 KB
-rw-r--r--
difflib.py
82.088 KB
-rw-r--r--
dis.py
20.088 KB
-rw-r--r--
doctest.py
102.093 KB
-rw-r--r--
dummy_threading.py
2.749 KB
-rw-r--r--
enum.py
37.242 KB
-rw-r--r--
filecmp.py
9.6 KB
-rw-r--r--
fileinput.py
14.364 KB
-rw-r--r--
fnmatch.py
3.983 KB
-rw-r--r--
formatter.py
14.788 KB
-rw-r--r--
fractions.py
23.759 KB
-rw-r--r--
ftplib.py
34.306 KB
-rw-r--r--
functools.py
36.529 KB
-rw-r--r--
genericpath.py
4.858 KB
-rw-r--r--
getopt.py
7.313 KB
-rw-r--r--
getpass.py
5.854 KB
-rw-r--r--
gettext.py
26.502 KB
-rw-r--r--
glob.py
5.563 KB
-rw-r--r--
gzip.py
20.911 KB
-rw-r--r--
hashlib.py
8.138 KB
-rw-r--r--
heapq.py
22.341 KB
-rw-r--r--
hmac.py
7.666 KB
-rw-r--r--
imaplib.py
52.35 KB
-rw-r--r--
imghdr.py
3.719 KB
-rw-r--r--
imp.py
10.289 KB
-rw-r--r--
inspect.py
115.771 KB
-rw-r--r--
io.py
3.458 KB
-rw-r--r--
ipaddress.py
69.965 KB
-rw-r--r--
keyword.py
0.923 KB
-rw-r--r--
linecache.py
5.205 KB
-rw-r--r--
locale.py
76.358 KB
-rw-r--r--
lzma.py
12.679 KB
-rw-r--r--
mailbox.py
76.817 KB
-rw-r--r--
mailcap.py
8.854 KB
-rw-r--r--
mimetypes.py
21.156 KB
-rw-r--r--
modulefinder.py
23.857 KB
-rw-r--r--
netrc.py
5.436 KB
-rw-r--r--
nntplib.py
42.247 KB
-rw-r--r--
ntpath.py
27.084 KB
-rw-r--r--
nturl2path.py
2.819 KB
-rw-r--r--
numbers.py
10.004 KB
-rw-r--r--
opcode.py
5.672 KB
-rw-r--r--
operator.py
10.46 KB
-rw-r--r--
optparse.py
58.954 KB
-rw-r--r--
os.py
38.081 KB
-rw-r--r--
pathlib.py
51.377 KB
-rw-r--r--
pdb.py
61.268 KB
-rwxr-xr-x
pickle.py
62.956 KB
-rw-r--r--
pickletools.py
91.295 KB
-rw-r--r--
pipes.py
8.707 KB
-rw-r--r--
pkgutil.py
20.996 KB
-rw-r--r--
platform.py
39.478 KB
-rwxr-xr-x
plistlib.py
31.465 KB
-rw-r--r--
poplib.py
14.724 KB
-rw-r--r--
posixpath.py
15.261 KB
-rw-r--r--
pprint.py
20.98 KB
-rw-r--r--
profile.py
22.994 KB
-rwxr-xr-x
pstats.py
26.704 KB
-rw-r--r--
pty.py
4.694 KB
-rw-r--r--
py_compile.py
8.011 KB
-rw-r--r--
pyclbr.py
14.897 KB
-rw-r--r--
pydoc.py
104.199 KB
-rw-r--r--
queue.py
11.09 KB
-rw-r--r--
quopri.py
7.082 KB
-rwxr-xr-x
random.py
28.127 KB
-rw-r--r--
re.py
15.489 KB
-rw-r--r--
reprlib.py
5.144 KB
-rw-r--r--
rlcompleter.py
6.931 KB
-rw-r--r--
runpy.py
11.77 KB
-rw-r--r--
sched.py
6.291 KB
-rw-r--r--
secrets.py
1.99 KB
-rw-r--r--
selectors.py
18.126 KB
-rw-r--r--
shelve.py
8.327 KB
-rw-r--r--
shlex.py
13.013 KB
-rw-r--r--
shutil.py
50.548 KB
-rw-r--r--
signal.py
2.22 KB
-rw-r--r--
site.py
21.326 KB
-rw-r--r--
smtpd.py
33.896 KB
-rwxr-xr-x
smtplib.py
43.946 KB
-rwxr-xr-x
sndhdr.py
6.933 KB
-rw-r--r--
socket.py
34.417 KB
-rw-r--r--
socketserver.py
26.656 KB
-rw-r--r--
sre_compile.py
26.069 KB
-rw-r--r--
sre_constants.py
6.986 KB
-rw-r--r--
sre_parse.py
39.287 KB
-rw-r--r--
ssl.py
49.57 KB
-rw-r--r--
stat.py
5.356 KB
-rw-r--r--
statistics.py
38.76 KB
-rw-r--r--
string.py
10.288 KB
-rw-r--r--
stringprep.py
12.614 KB
-rw-r--r--
struct.py
0.251 KB
-rw-r--r--
subprocess.py
76.416 KB
-rw-r--r--
sunau.py
17.944 KB
-rw-r--r--
symbol.py
2.06 KB
-rw-r--r--
symtable.py
7.833 KB
-rw-r--r--
sysconfig.py
24.313 KB
-rw-r--r--
tabnanny.py
11.139 KB
-rwxr-xr-x
tarfile.py
103.978 KB
-rwxr-xr-x
telnetlib.py
22.709 KB
-rw-r--r--
tempfile.py
26.892 KB
-rw-r--r--
textwrap.py
18.952 KB
-rw-r--r--
this.py
0.979 KB
-rw-r--r--
threading.py
49.629 KB
-rw-r--r--
timeit.py
13.164 KB
-rwxr-xr-x
token.py
2.313 KB
-rw-r--r--
tokenize.py
25.235 KB
-rw-r--r--
trace.py
29.17 KB
-rwxr-xr-x
traceback.py
23.058 KB
-rw-r--r--
tracemalloc.py
16.676 KB
-rw-r--r--
tty.py
0.858 KB
-rw-r--r--
turtle.py
140.348 KB
-rw-r--r--
types.py
9.485 KB
-rw-r--r--
typing.py
67.346 KB
-rw-r--r--
uu.py
7.106 KB
-rw-r--r--
uuid.py
29.8 KB
-rw-r--r--
warnings.py
19.227 KB
-rw-r--r--
wave.py
17.803 KB
-rw-r--r--
weakref.py
20.886 KB
-rw-r--r--
webbrowser.py
23.519 KB
-rwxr-xr-x
xdrlib.py
5.774 KB
-rw-r--r--
zipapp.py
7.358 KB
-rw-r--r--
zipfile.py
85.672 KB
-rw-r--r--
zipimport.py
30.044 KB
-rw-r--r--