mirror of
https://github.com/python/cpython.git
synced 2025-11-20 10:57:44 +00:00
More difflib examples. Written for GHOP by Josip Dzolonga.
This commit is contained in:
parent
ad61bc8d9b
commit
080b094d20
1 changed files with 112 additions and 2 deletions
|
|
@ -148,7 +148,27 @@ diffs. For comparing directories and files, see also, the :mod:`filecmp` module.
|
||||||
expressed in the format returned by :func:`time.ctime`. If not specified, the
|
expressed in the format returned by :func:`time.ctime`. If not specified, the
|
||||||
strings default to blanks.
|
strings default to blanks.
|
||||||
|
|
||||||
:file:`Tools/scripts/diff.py` is a command-line front-end for this function.
|
::
|
||||||
|
|
||||||
|
>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
|
||||||
|
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
|
||||||
|
>>> for line in context_diff(s1, s2, fromfile='before.py', tofile='after.py'):
|
||||||
|
... sys.stdout.write(line)
|
||||||
|
*** before.py
|
||||||
|
--- after.py
|
||||||
|
***************
|
||||||
|
*** 1,4 ****
|
||||||
|
! bacon
|
||||||
|
! eggs
|
||||||
|
! ham
|
||||||
|
guido
|
||||||
|
--- 1,4 ----
|
||||||
|
! python
|
||||||
|
! eggy
|
||||||
|
! hamster
|
||||||
|
guido
|
||||||
|
|
||||||
|
See :ref:`difflib-interface` for a more detailed example.
|
||||||
|
|
||||||
.. versionadded:: 2.3
|
.. versionadded:: 2.3
|
||||||
|
|
||||||
|
|
@ -265,7 +285,25 @@ diffs. For comparing directories and files, see also, the :mod:`filecmp` module.
|
||||||
expressed in the format returned by :func:`time.ctime`. If not specified, the
|
expressed in the format returned by :func:`time.ctime`. If not specified, the
|
||||||
strings default to blanks.
|
strings default to blanks.
|
||||||
|
|
||||||
:file:`Tools/scripts/diff.py` is a command-line front-end for this function.
|
::
|
||||||
|
|
||||||
|
|
||||||
|
>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
|
||||||
|
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
|
||||||
|
>>> for line in unified_diff(s1, s2, fromfile='before.py', tofile='after.py'):
|
||||||
|
... sys.stdout.write(line)
|
||||||
|
--- before.py
|
||||||
|
+++ after.py
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-bacon
|
||||||
|
-eggs
|
||||||
|
-ham
|
||||||
|
+python
|
||||||
|
+eggy
|
||||||
|
+hamster
|
||||||
|
guido
|
||||||
|
|
||||||
|
See :ref:`difflib-interface` for a more detailed example.
|
||||||
|
|
||||||
.. versionadded:: 2.3
|
.. versionadded:: 2.3
|
||||||
|
|
||||||
|
|
@ -649,3 +687,75 @@ As a single multi-line string it looks like this::
|
||||||
? ++++ ^ ^
|
? ++++ ^ ^
|
||||||
+ 5. Flat is better than nested.
|
+ 5. Flat is better than nested.
|
||||||
|
|
||||||
|
|
||||||
|
.. _difflib-interface:
|
||||||
|
|
||||||
|
A command-line interface to difflib
|
||||||
|
-----------------------------------
|
||||||
|
|
||||||
|
This example shows how to use difflib to create a ``diff``-like utility.
|
||||||
|
It is also contained in the Python source distribution, as
|
||||||
|
:file:`Tools/scripts/diff.py`.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
""" Command line interface to difflib.py providing diffs in four formats:
|
||||||
|
|
||||||
|
* ndiff: lists every line and highlights interline changes.
|
||||||
|
* context: highlights clusters of changes in a before/after format.
|
||||||
|
* unified: highlights clusters of changes in an inline format.
|
||||||
|
* html: generates side by side comparison with change highlights.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys, os, time, difflib, optparse
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Configure the option parser
|
||||||
|
usage = "usage: %prog [options] fromfile tofile"
|
||||||
|
parser = optparse.OptionParser(usage)
|
||||||
|
parser.add_option("-c", action="store_true", default=False,
|
||||||
|
help='Produce a context format diff (default)')
|
||||||
|
parser.add_option("-u", action="store_true", default=False,
|
||||||
|
help='Produce a unified format diff')
|
||||||
|
hlp = 'Produce HTML side by side diff (can use -c and -l in conjunction)'
|
||||||
|
parser.add_option("-m", action="store_true", default=False, help=hlp)
|
||||||
|
parser.add_option("-n", action="store_true", default=False,
|
||||||
|
help='Produce a ndiff format diff')
|
||||||
|
parser.add_option("-l", "--lines", type="int", default=3,
|
||||||
|
help='Set number of context lines (default 3)')
|
||||||
|
(options, args) = parser.parse_args()
|
||||||
|
|
||||||
|
if len(args) == 0:
|
||||||
|
parser.print_help()
|
||||||
|
sys.exit(1)
|
||||||
|
if len(args) != 2:
|
||||||
|
parser.error("need to specify both a fromfile and tofile")
|
||||||
|
|
||||||
|
n = options.lines
|
||||||
|
fromfile, tofile = args # as specified in the usage string
|
||||||
|
|
||||||
|
# we're passing these as arguments to the diff function
|
||||||
|
fromdate = time.ctime(os.stat(fromfile).st_mtime)
|
||||||
|
todate = time.ctime(os.stat(tofile).st_mtime)
|
||||||
|
fromlines = open(fromfile, 'U').readlines()
|
||||||
|
tolines = open(tofile, 'U').readlines()
|
||||||
|
|
||||||
|
if options.u:
|
||||||
|
diff = difflib.unified_diff(fromlines, tolines, fromfile, tofile,
|
||||||
|
fromdate, todate, n=n)
|
||||||
|
elif options.n:
|
||||||
|
diff = difflib.ndiff(fromlines, tolines)
|
||||||
|
elif options.m:
|
||||||
|
diff = difflib.HtmlDiff().make_file(fromlines, tolines, fromfile,
|
||||||
|
tofile, context=options.c,
|
||||||
|
numlines=n)
|
||||||
|
else:
|
||||||
|
diff = difflib.context_diff(fromlines, tolines, fromfile, tofile,
|
||||||
|
fromdate, todate, n=n)
|
||||||
|
|
||||||
|
# we're using writelines because diff is a generator
|
||||||
|
sys.stdout.writelines(diff)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue