Python将日期元组字符串转换为元组列表



我在.ini文件中有一个变量,它是日期格式的元组列表。我想在循环中使用相同的,但会出现错误

INI文件示例

[VALUES]
date_range=[(2019-01-01,2019-12-31),(2020-01-01,2020-01-31),(2020-02-01,2020-02-28)]

脚本

import configparser
import ast
config = configparser.ConfigParser()
config.read('config_file.ini')
date_range = config.get('VALUES','date_range')
print("Date Range - "+date_range)
for tuple_val in date_range:
print("Tuple value - "+ tuple_val)
start,end = tuple_val
print("Start date - "+start+" and End date -"+ end)

上面给出了下面的错误,因为从.ini文件读取时,date_range值似乎被视为字符串。

Date Range - [(2019-01-01,2019-12-31),(2020-01-01,2020-01-31),(2020-02-01,2020-02-28)]
Tuple - [
Traceback (most recent call last):
File "sample.py", line 236, in <module>
for_loop()
File "sample.py", line 205, in for_loop
start,end = tuple_val
ValueError: not enough values to unpack (expected 2, got 1)

我试图用ast.literal_eval((转换它,但得到了无效的令牌错误。我们非常感谢为达到预期结果所提供的任何帮助。

date_range = ast.literal_eval(config.get('VALUES','date_range'))

这里有另一个解决方案,

from ast import literal_eval
# convert into valid string's by adding appropriate quotes
date_range = (
config.get('VALUES','date_range').replace("(", "('").replace(")", "')")
)
# [('2019-01-01,2019-12-31'),('2020-01-01,2020-01-31'),('2020-02-01,2020-02-28')]
date_range = literal_eval(date_range)
for d in date_range:
start_date, end_date = d.split(",")
# print(start_date, end_date) 

date_range中的各个项目需要用引号括起来(例如。CCD_ 2(,然后CCD_。

如果无法更改您的ini文件来完成此操作,那么您可以在读取它们后使用regexp替换来添加它们。

例如:

import re
...
date_range_s = re.sub('(s*(.*?)s*,s*(.*?)s*)', r'("1","2")',
config.get('VALUES','date_range'))
date_range = ast.literal_eval(date_range_s)

字符串date_range_s的示例,此替换之后:

>>> print(date_range_s)
[("2019-01-01","2019-12-31"),("2020-01-01","2020-01-31"),("2020-02-01","2020-02-28")]

代码的其余部分应该按原样工作,并给出:

Start date - 2019-01-01 and End date - 2019-12-31
Start date - 2020-01-01 and End date - 2020-01-31
Start date - 2020-02-01 and End date - 2020-02-28

此regexp还将忽略项目周围的任何空格,因此,如果您有例如(2019-01-01, 2019-12-31),则这不是问题,并且空格最终不会形成字符串的一部分。

但是,请注意,此regexp不会测试是否已经存在引号,因此,如果都在配置文件中提供字符串,并且使用regexp替换,则会再次打断它。做一个或另一个。

还要注意,这不是n元素元组的一般解决方案。它是专门为你这里的2元素的。

最新更新