Source code for andes.variables.fileman

import io
import logging
import os

logger = logging.getLogger(__name__)


[docs]class FileMan: """ Define a File Manager class for System """
[docs] def __init__(self, case=None, **kwargs): """ Initialize the output file names. For inputs, all absolute paths will be respected. All relative paths are relative to `input_path`. case: must be full path to case output: desired name for format conversion output input_path: default path for input files that only contains file name. If `input_path` is not provided, it will be derived from the path of `case`. output_path: path for output files. Default to current working directory where `andes` is invoked. """ self.input_format = None self.output_format = None self.add_format = None self.case = None self.input_path = '' self.case_path = '' # absolute path containinng the case file self.fullname = None self.name = None self.ext = None self.addfile = None self.pert = None self.output_path = None self.no_output = True self._out_fields = ['txt', 'dump', 'lst', 'eig', 'npy', 'npz', 'csv', 'mat', 'prof', 'prof_raw'] self.set(case, **kwargs)
[docs] def set(self, case=None, **kwargs): """ Perform the input and output set up. """ self.case = case input_format = kwargs.get('input_format') add_format = kwargs.get('add_format') input_path = kwargs.get('input_path') addfile = kwargs.get('addfile') no_output = kwargs.get('no_output') output_path = kwargs.get('output_path') output = kwargs.get('output') # base file name for the output pert = kwargs.get('pert') dump = kwargs.get('dump') # set output fields anyway for item in self._out_fields: self.__dict__[item] = None if case is None: return self.input_format = input_format self.add_format = add_format self.input_path = input_path if input_path is not None else '' self.output_path = output_path if output_path is not None else '' self.case = case if os.path.isfile(case): self.case_path, self.fullname = os.path.split(self.case) self.case_path = os.path.abspath(self.case_path) else: self.fullname = '' # `self.name` is the name part without extension self.name, self.ext = os.path.splitext(self.fullname) self.addfile = self.get_fullpath(addfile) self.pert = self.get_fullpath(pert) if dump is None: dump = self.name # set the output file names anyway if not output: output = add_suffix(self.name, 'out') prof = add_suffix(self.name, 'prof') eig = add_suffix(self.name, 'eig') mat = add_suffix(self.name, 'As') self.lst = os.path.join(self.output_path, output + '.lst') self.npy = os.path.join(self.output_path, output + '.npy') self.npz = os.path.join(self.output_path, output + '.npz') self.csv = os.path.join(self.output_path, output + '.csv') self.txt = os.path.join(self.output_path, output + '.txt') self.eig = os.path.join(self.output_path, eig + '.txt') self.prof = os.path.join(self.output_path, prof + '.txt') self.mat = os.path.join(self.output_path, mat + '.mat') self.prof_raw = os.path.join(self.output_path, prof + '.prof') self.dump = os.path.join(self.output_path, dump + '.xlsx') # use `self.no_output` to control calls to saving functions if no_output: self.no_output = True else: self.no_output = False
[docs] def get_fullpath(self, fullname=None): """ Return the original full path if full path is specified, otherwise search in the case file path. Parameters ---------- fullname : str, optional Full name of the file. If relative, prepend `input_path`. Otherwise, leave it as is. """ # if is an empty path if not fullname: return fullname if isinstance(fullname, io.IOBase): return '' isabs = os.path.isabs(fullname) path, name = os.path.split(fullname) if not name: # path to a folder return '' else: # path to a file if isabs: return fullname else: return os.path.join(self.input_path, path, name)
[docs]def add_suffix(fullname, suffix): """ Add suffix to a full file name. """ name, ext = os.path.splitext(fullname) return name + '_' + suffix + ext