| """Collection of utilities for command-line interfaces and console scripts.""" | |
| import os | |
| import re | |
| numberAddedRE = re.compile(r"#\d+$") | |
| def makeOutputFileName( | |
| input, outputDir=None, extension=None, overWrite=False, suffix="" | |
| ): | |
| """Generates a suitable file name for writing output. | |
| Often tools will want to take a file, do some kind of transformation to it, | |
| and write it out again. This function determines an appropriate name for the | |
| output file, through one or more of the following steps: | |
| - changing the output directory | |
| - appending suffix before file extension | |
| - replacing the file extension | |
| - suffixing the filename with a number (``#1``, ``#2``, etc.) to avoid | |
| overwriting an existing file. | |
| Args: | |
| input: Name of input file. | |
| outputDir: Optionally, a new directory to write the file into. | |
| suffix: Optionally, a string suffix is appended to file name before | |
| the extension. | |
| extension: Optionally, a replacement for the current file extension. | |
| overWrite: Overwriting an existing file is permitted if true; if false | |
| and the proposed filename exists, a new name will be generated by | |
| adding an appropriate number suffix. | |
| Returns: | |
| str: Suitable output filename | |
| """ | |
| dirName, fileName = os.path.split(input) | |
| fileName, ext = os.path.splitext(fileName) | |
| if outputDir: | |
| dirName = outputDir | |
| fileName = numberAddedRE.split(fileName)[0] | |
| if extension is None: | |
| extension = os.path.splitext(input)[1] | |
| output = os.path.join(dirName, fileName + suffix + extension) | |
| n = 1 | |
| if not overWrite: | |
| while os.path.exists(output): | |
| output = os.path.join( | |
| dirName, fileName + suffix + "#" + repr(n) + extension | |
| ) | |
| n += 1 | |
| return output | |