import os # files i/o def check_file(path, fail=True): if fail: if not os.path.exists(path): raise IOError("File does not exist: {}.".format(path)) if not os.path.isfile(path): raise IOError("{} is not a file.".format(path)) return True else: return os.path.exists(path) and os.path.isfile(path) def check_directory(path, fail=True): if fail: if not os.path.exists(path): raise IOError("File does not exist: {}.".format(path)) if not os.path.isdir(path): raise IOError("{} is not a directory.".format(path)) return True else: return os.path.exists(path) and os.path.isdir(path) def read_file(filepath): check_file(filepath) with open(filepath, 'r') as f: s = f.read() return s def write_file(filepath, data): check_directory(os.path.dirname(filepath)) with open(filepath, 'w') as f: f.write(data) # dealing with formatless content def get_content(self, path): """Will be useful when we need to get content from url""" return read_file(path) def move_content(self, source, target, overwrite = False): if source == target: return if not overwrite and os.path.exists(target): raise IOError('target file exists') shutil.move(source, target) def copy_content(self, source, target, overwrite = False): if source == target: return if not overwrite and os.path.exists(target): raise IOError('target file exists') shutil.copy(source, target) # editor input def editor_input(editor, initial="", suffix=None): """Use an editor to get input""" if suffix is None: suffix = '.tmp' with tempfile.NamedTemporaryFile(suffix=suffix, delete=False) as temp_file: tfile_name = temp_file.name temp_file.write(initial) temp_file.flush() cmd = editor.split() # this enable editor command with option, e.g. gvim -f cmd.append(tfile_name) subprocess.call(cmd) with open(tfile_name) as temp_file: content = temp_file.read() os.remove(tfile_name) return content def edit_file(editor, path_to_file, temporary=True): if temporary: check_file(path_to_file, fail=True) with open(path_to_file) as f: content = f.read() content = editor_input(editor, content) with open(path_to_file, 'w') as f: f.write(content) else: cmd = editor.split() # this enable editor command with option, e.g. gvim -f cmd.append(path_to_file) subprocess.call(cmd)