обновить поле формата даты с текущей меткой даты и времени через модуль configparser

#python-3.x #configparser

#python-3.x #configparser

Вопрос:

Я использую функцию интерполяции модуля configparser. Моя проблема заключается в значении, которое упоминается в разных разделах, я бы хотел, чтобы оно имело дату или datetime как часть своего значения. Ниже приведено то, что я мог бы придумать, хотя это делает мою работу, я чувствую, что мог бы быть лучший и элегантный способ справиться с этим.

 import configparser
from io import StringIO
import datetime


def update_tmstmp_value(config_string):
    fo = StringIO(config_string)
    data = ''
    for line in fo.readlines():
        if line.startswith('tmstmp'):
            key, tmstmp_str = line.strip().split('=')
            try:
                value = datetime.datetime.now().strftime(tmstmp_str)
            except ValueError:
                value = datetime.datetime.now().strftime('%Y%m%d')
            data  = key   '='   value   'n'
        else:
            data  = line
    return data


config_data = """
[DEFAULT]
tmstmp=%Y%m%d
type=REPLACE_ME_%(tmstmp)s

[section1]
item1=val1_%(type)s
item2=val2

[section2]
item3=val3_%(type)s
item4=val4
"""

config = configparser.ConfigParser()
modified_config_data = update_tmstmp_value(config_data)
config.read_string(modified_config_data)
print(config.items('section1'))
  

Вывод:

 [('tmstmp', '20190402'), ('type', 'REPLACE_ME_20190402'), ('item1', 'val1_REPLACE_ME_20190402'), ('item2', 'val2')]
  

Ответ №1:

У меня есть следующие функции в классе-оболочке для ConfigParser, которые выполняют в значительной степени то, что вы пытаетесь сделать.

Таким образом, я могу добавить дату к любому из параметров option=vars, которые я хочу.

     def get_date():
        """
        Sets up a date formatted string.

        :return: Date string
        """
        return datetime.now().strftime("%Y%b%d")

    def prepend_date_to_var(self, sect, option):
        """
        Function that allows the ability to prepend a
        date to a section variable.

        :param sect: INI section to look for variable
        :param option: INI search variable under INI section
        :return: Date is prepended to variable
        """
        if self.config_parser.get(sect, option):
            var = self.config_parser.get(sect, option)
            var_with_date = var   '_'   self.get_date()
            self.config_parser.set(sect, option, var_with_date)