#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)