| 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 |