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
相关产品推荐
相关产品推荐

