繁体   English   中英

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

[英]Python convert string of date tuples to list of tuples

我在 .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 值似乎被视为字符串。

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

在您的个人物品date_range将需要用引号括起来(如"2019-01-01" )前literal_eval可以把它们当做字符串。

如果无法更改您的 ini 文件以执行此操作,那么您可以在阅读它们后使用正则表达式替换来添加它们。

例如:

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

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

但是请注意,这个正则表达式不会测试是否有行情已经呈现,因此,如果供需双方在配置文件中的字符串,还可以使用正则表达式替换,那么你将再次打破它。 做一个或另一个。

另请注意,这不是 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) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM