Python脚本重复运行时如何仅首次执行df_new创建代码并保留数据状态
问题描述
从网络获取数据生成df,执行代码:
df_new = df.drop(df.columns[[1, 2]],axis = 1)
创建df_new后,脚本需要每隔约1分钟重复运行,后续要通过增量添加新列来更新df_new。但每次重复运行时,df_new都会被重新创建,导致之前的操作丢失。需求是:
- 仅在首次运行时执行
df_new = df.drop(...)这行代码 - 每隔1分钟更新
df,并基于已有的df_new添加新列
解决方案
方法1:用全局变量标记首次运行
用全局变量记录初始化状态,每次运行时判断状态决定是否执行初始化:
# 全局标记,初始为False表示未完成初始化 is_first_run = True df_new = None def run_script(): global is_first_run, df_new # 每次运行都从网络拉取最新df df = get_data_from_network() # 替换成你的网络数据获取逻辑 if is_first_run: # 首次运行才初始化df_new df_new = df.drop(df.columns[[1, 2]], axis=1) is_first_run = False else: # 非首次运行,基于新df给df_new增量添加列 # 示例:替换成你的实际计算逻辑 df_new['new_calculated_col'] = df['source_col'].apply(your_calculate_func) # 后续其他处理逻辑 ... # 定时循环运行 import time while True: run_script() time.sleep(60) # 间隔1分钟
方法2:用本地文件记录初始化状态
如果脚本可能被中断重启,全局变量会失效,可通过本地文件标记初始化状态:
import os import time # 标记文件,用来记录是否已初始化 INIT_MARK_FILE = '.df_init_flag' df_new = None def run_script(): global df_new df = get_data_from_network() if not os.path.exists(INIT_MARK_FILE): # 首次运行:初始化df_new并创建标记文件 df_new = df.drop(df.columns[[1, 2]], axis=1) with open(INIT_MARK_FILE, 'w') as f: f.write('initialized') else: # 非首次运行:增量更新df_new df_new['latest_data_col'] = df['fresh_data_col'] ... # 后续处理逻辑 ... while True: run_script() time.sleep(60)
注:需要重置初始化状态时,手动删除.df_init_flag文件即可。
方法3:用类封装状态
若脚本逻辑复杂,用类维护df_new和运行状态会更清晰:
import time class DataHandler: def __init__(self): self.initialized = False self.df_new = None def fetch_latest_df(self): # 封装网络获取数据的逻辑 return get_data_from_network() def process_data(self): df = self.fetch_latest_df() if not self.initialized: self.df_new = df.drop(df.columns[[1, 2]], axis=1) self.initialized = True else: # 增量添加新列,示例用时间戳作为列名 self.df_new[f'col_{int(time.time())}'] = df['target_col'] # 后续处理逻辑 ... # 实例化并定时运行 handler = DataHandler() while True: handler.process_data() time.sleep(60)
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

