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

Python将日期元组字符串转换为元组列表,python,tuples,abstract-syntax-tree,Python,Tuples,Abstract Syntax Tree,我在.ini文件中有一个变量,它是具有日期格式的元组列表。我想在for循环中使用相同的方法,但会出现错误 示例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_fi

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

示例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 - [(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)

您的
日期范围内的各个项目需要用引号括起来(例如。
“2019-01-01”
)之前,可以将它们视为字符串

如果无法更改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)
替换后的字符串
日期范围
示例:

>>> 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-012019-12-31)
,则这不是问题,并且空格不会最终形成字符串的一部分

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


还要注意,这不是n元素元组的通用解决方案。这是专门针对您这里的两个元素。

您的
日期范围内的单个项目需要用引号括起来(例如。
“2019-01-01”
)之前,可以将它们视为字符串

如果无法更改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)
替换后的字符串
日期范围
示例:

>>> 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-012019-12-31)
,则这不是问题,并且空格不会最终形成字符串的一部分

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


还要注意,这不是n元素元组的通用解决方案。这是专门针对这里的2元素解决方案。

这里是另一个解决方案

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) 

这是另一个解决方案

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) 

您是如何从ini文件中获取数据的?您在读取.ini文件时遇到问题吗?您的初始日期范围已经是一个元组列表。这根绳子看起来像什么?嗨。。让我编辑后,有明确的想法与样本script@Manimaran您可以选择更改ini文件中字符串的格式,还是必须使用现有的格式?如何从ini文件中获取数据?读取.ini文件时是否遇到问题?您的初始日期范围已经是一个元组列表。这根绳子看起来像什么?嗨。。让我编辑后,有明确的想法与样本script@Manimaran您可以选择更改ini文件中字符串的格式,还是必须使用现有的格式?谢谢@alani。。这奏效了。。我有权编辑ini文件,并用双引号将项目括起来。@Manimaran,如果你觉得上面的答案对你有帮助,你可以。谢谢@alani。。这奏效了。。我有权编辑ini文件,并用双引号括起项目。Manimaran,如果你觉得上面的答案对你有帮助,你可以。