# textdiff.py D. Parson August 27, 2023, simple differ for at home __usage__ = 'USAGE: python3 textdiff.py YOURFILE REFFILE' import sys if __name__ == '__main__': # Invoked from command line. if len(sys.argv) != 3: raise ValueError(__usage__) elif sys.argv[1] == sys.argv[2]: raise ValueError(sys.argv[1] + ' and ' + sys.argv[2] + ' are the same file.') left = open(sys.argv[1], 'r') right = open(sys.argv[2], 'r') errors = 0 leftlines = left.readlines() rightlines = right.readlines() left.close() right.close() # Reference file captured in Linux. Windows output tacks on a # that readlines() treats as an extra blank line. Filter # out any blank lines before processing. leftlines = [line.strip() for line in leftlines] # strip() removes spaces rightlines = [line.strip() for line in rightlines] # but not extra lines def filterFunc(line): return (line != '') leftlines = list(filter(filterFunc, leftlines)) rightlines = list(filter(filterFunc, rightlines)) if len(leftlines) != len(rightlines): sys.stderr.write('ERROR, ' + sys.argv[1] + ' has ' + str(len(leftlines)) + ' lines, ' + sys.argv[2] + ' has ' + str(len(rightlines)) + ' lines.\n') errors = 1 for lineix in range(0, len(rightlines)): if (lineix >= len(leftlines)) or (lineix >= len(rightlines)): # error was reported, do not compare them. break leftline = leftlines[lineix] rightline = rightlines[lineix] if leftline != rightline: sys.stderr.write('\nERROR, Diff at line ' + str(lineix+1) + '\n') sys.stderr.write('< ' + leftline + '\n') sys.stderr.write('> ' + rightline + '\n') errors += 1 if errors > 4: break if errors: sys.exit(1) sys.exit(0) # zero means no error, non-zero means error(s)