我正在使用configparser模块的插值功能。我的问题是针对不同部分引用的值,我希望将日期或日期时间作为其值的一部分。以下是我能想到的,虽然它完成了我的工作,我觉得可以有更好,更优雅的方式来处理这个问题。
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')]
我在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)