<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def save(self, specfiles=None, rm=False, ci=False, smi=False, sai=False, si=False, compress=True, path=None):
 """Writes the specified datatypes to ``mrc`` files on the hard disk. .. note:: If ``.save()`` is called and no ``mrc`` files are present in the specified path new files are generated, otherwise old files are replaced. :param specfiles: the name of an ms-run file or a list of names. If None all specfiles are selected. :type specfiles: None, str, [str, str] :param rm: bool, True to select ``self.rmc`` (run metadata) :param ci: bool, True to select ``self.cic`` (chromatogram items) :param smi: bool, True to select ``self.smic`` (spectrum metadata items) :param sai: bool, True to select ``self.saic`` (spectrum array items) :param si: bool, True to select ``self.sic`` (spectrum items) :param compress: bool, True to use zip file compression :param path: filedirectory to which the ``mrc`` files are written. By default the parameter is set to ``None`` and the filedirectory is read from ``self.info[specfile]['path']`` """

        if specfiles is None:
            specfiles = [_ for _ in viewkeys(self.info)]
        else:
            specfiles = aux.toList(specfiles)
        datatypes = self._processDatatypes(rm, ci, smi, sai, si)
        if len(datatypes) == 0:
            datatypes = ['rm', 'ci', 'smi', 'sai', 'si']

        for specfile in specfiles:
            if specfile not in self.info:
                warntext = 'Error while calling "MsrunContainer.save()": "%s" '\
                           'is not present in "MsrunContainer.info"!'\
                            % (specfile, )
                warnings.warn(warntext)
                continue
            else:
                msrunInfo = self.info[specfile]
                specfilePath = msrunInfo['path'] if path is None else path

            with aux.PartiallySafeReplace() as msr:
                for datatype in datatypes:
                    filename = specfile + '.mrc_' + datatype
                    filepath = aux.joinpath(specfilePath, filename)
                    with msr.open(filepath, 'w+b') as openfile:
                        if datatype == 'rm':
                           self._writeRmc(openfile, specfile)
                        elif datatype == 'ci':
                           self._writeCic(openfile, specfile, compress)
                        elif datatype == 'si':
                           self._writeSic(openfile, specfile, compress)
                        elif datatype == 'smi':
                           self._writeSmic(openfile, specfile, compress)
                        elif datatype == 'sai':
                           self._writeSaic(openfile, specfile, compress)