from builtins import open as _orig_open def open(file, mode='r', bufsize=-1): if 'w' not in mode: return _orig_open(file, mode, bufsize) import os backup = file + '~' try: os.unlink(backup) except OSError: pass try: os.rename(file, backup) except OSError: return _orig_open(file, mode, bufsize) f = _orig_open(file, mode, bufsize) _orig_close = f.close def close(): _orig_close() import filecmp if filecmp.cmp(backup, file, shallow=False): import os os.unlink(file) os.rename(backup, file) f.close = close return f