You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何实现交替遍历2个事务文件逐行执行对应操作

实现方案

你原有代码中parseTransaction会一次性遍历执行完单个事务的所有内容,不符合逐行交替执行的需求,需要拆分执行逻辑,具体修改如下:


1. 拆分单行指令执行逻辑,修复匹配bug

先将单行指令的执行逻辑抽为独立方法,同时处理行尾空白字符导致COMMIT/END等指令匹配失败的问题:

import itertools
import pandas as pd

class Database:
    # 原有__init__、readFile、read、execute、write方法保持不变
    
    # 新增:执行单条事务指令
    def execute_single_line(self, line, transaction_id, schedule_num):
        line = line.strip()
        if not line:
            return True # 跳过空行
        split_line = line.split(',')
        # 写入调度日志
        with open(f'schedule{schedule_num}.txt', 'a') as f:
            f.write(f'Transaction {transaction_id}: {split_line[0]}\n')
        # 执行对应操作
        if split_line[0] == "START":
            return True
        elif split_line[0] == "READ":
            self.read(self.temp_db, split_line[1], split_line[2].strip())
            return True
        elif split_line[0] == "EXECUTE":
            self.execute(split_line[1].strip())
            return True
        elif split_line[0] == "WRITE":
            self.write(self.temp_db, split_line[1], split_line[2].strip())
            return True
        elif split_line[0] == "COMMIT":
            return True
        elif split_line[0] == "END":
            return False # 返回False表示当前事务执行结束
    
    # 新增:加载单个事务文件的行迭代器
    def load_transaction(self, file_path):
        with open(file_path, 'r') as f:
            for line in f:
                yield line

    # 新增:交替执行两个事务
    def interleave_two_trans(self, file1, trans_id1, file2, trans_id2, schedule_num):
        self.temp_db = self.file.copy() # 每组事务执行前重置数据库副本
        iter1 = self.load_transaction(file1)
        iter2 = self.load_transaction(file2)
        trans1_alive = True
        trans2_alive = True
        # 交替取两个迭代器的行
        for line1, line2 in itertools.zip_longest(iter1, iter2):
            if line1 and trans1_alive:
                trans1_alive = self.execute_single_line(line1, trans_id1, schedule_num)
            if line2 and trans2_alive:
                trans2_alive = self.execute_single_line(line2, trans_id2, schedule_num)
        # 执行结束保存当前组的数据库结果
        self.temp_db.to_csv(f'C:\\Users\\laner\\Desktop\\program 3\\database_{schedule_num}.txt', sep=',')
        self.temp_db = None

    # 新增:6个文件两两分组执行
    def process_all_pairs(self):
        # 按顺序两两分组:(t1,t2)、(t3,t4)、(t5,t6),可根据需求调整分组逻辑
        pairs = [
            ('t1.txt', '1', 't2.txt', '2', '2'),
            ('t3.txt', '3', 't4.txt', '4', '3'),
            ('t5.txt', '5', 't6.txt', '6', '4')
        ]
        for pair in pairs:
            self.interleave_two_trans(*pair)

2. 使用方式

实例化Database类后直接调用process_all_pairs()方法,即可按组交替执行两个事务的指令,直到当前组的两个文件全部遍历完成后再处理下一组。


关键逻辑说明

  • 用生成器加载事务文件,不需要一次性读取全量内容到内存,适配大文件场景
  • itertools.zip_longest会按顺序交替从两个事务迭代器取行,其中一个事务遍历结束后会继续执行另一个事务的剩余内容
  • 每个分组执行前都会复制初始数据库副本,避免不同分组的执行结果互相干扰

内容的提问来源于stack exchange,提问作者MaddieP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:36:03