在python for循环中管理变量



下面是我的输入日期值:

job1_started = '2020-01-01' 
job1_end  = '2021-01-01' 
job2_started = '2022-01-01' 
job2_end = '2023-01-01' 
. 
. 
jobn_started = '2023-01-01' 
jobn_end = '2023-01-01'

下面是我的输入列表:

lst=['job1','job2',...... 'jobn']

我需要循环浏览列表中的所有值,并在相应的日期值上添加1天。

for date in lst:
< logic needed>

以下是预期输出:(增加一天)

job1_started = '2020-01-02'
job1_end  = '2021-01-02'
job2_started = '2022-01-02'
job2_end = '2023-01-02'
. 
.  
jobn_started = '2023-01-02'
jobn_end = '2023-01-02'

我该怎么做?

  1. 如果我理解正确,您的第一个问题是如何通过名称检索变量值。我给你看两种方法。

    • 数据结构dict

      有两个内在目录记录了当前范围内所有全局/局部变量从名称到值的过程,分别可以通过globals()locals()获取。因此,globals()['job1_started']locals()['job1_started']将为您提供全局变量job1_started或局部变量的值。

    • 内置功能eval

      eval计算给定命名空间(默认本地命名空间)中的表达式字符串。因此,eval('job1_started')相当于locals()['job1_started']。但是在使用eval时应该非常小心,因为该字符串可能是一个危险的表达式,例如"__import__('os').system('rm -rf something_important')"

  2. 第二个问题是如何在日期字符串中添加1天。您可以使用datetime模块来实现这一点。

    • 使用strptime将字符串转换为datetime.datetime对象,使用strftime进行反向转换
    • 使用datetime.timedelta更新日期

示例

import datetime
job1_started = '2020-01-01'
job1_end = '2021-01-01'
jobs = ["job1"]
for job in jobs:
for suffix in ('_started', '_end'):
var_name = job + suffix
date_str = locals()[var_name]
date = datetime.datetime.strptime(date_str, "%Y-%m-%d") # 2020-01-01 00:00:00
date_delta = datetime.timedelta(days=1)
date = date + date_delta  # 2020-01-02 00:00:00
date_str = datetime.datetime.strftime(date, "%Y-%m-%d") # '2020-01-02'
# update the variable at the local scope
locals()[var_name] = date_str
print(f'{var_name} = {date_str}')

最新更新