[英]Iterate through 2 files at once performing actions back and forth between the two
我對如何在 python 中實現這一點有點困惑,我需要能夠遍歷總共 6 個文件,但一次 2 個文件,並從一個文件中讀取一行,執行該行的操作,然后切換到讀取來自另一個文件的一行並按照它說的做,然后反之亦然迭代兩個文件,這是文件的樣子:
START,T1
READ,y,B3
EXECUTE,y+1
WRITE,y,B3
READ,z,C1
READ,x,A3
EXECUTE,z=z+x
EXECUTE,x+2
EXECUTE,x+2
WRITE,x,A3
WRITE,z,C1
READ,y,B3
EXECUTE,y+8
READ,z,B2
EXECUTE,z+2
WRITE,z,B2
WRITE,y,B3
READ,x,A1
EXECUTE,x+3
WRITE,x,A1
COMMIT
END,T1
這是我當前可以解析它們的代碼:
class Database:
def __init__(self):
self.file = self.readFile()
self.temp_db = None
self.y = 0
self.x = 0
self.z = 0
def readFile(self):
df = pd.read_csv('database.txt', sep=',', engine='python')
df = df.iloc[: , 1:]
df.index = df.index + 1
return df
def parseTransaction(self, fileName, num, transaction):
# if(self.temp_db == None):
# self.temp_db = self.file
with open(fileName, 'r') as t1_file:
for line in t1_file:
split_line = line.split(',')
with open('schedule'+num+'.txt', 'a') as the_file:
the_file.write('Transaction ' + transaction + ': ' + split_line[0] + '\n')
if(split_line[0] == "START"):
continue
elif(split_line[0] == "READ"):
self.read(self.temp_db, split_line[1], split_line[2])
elif(split_line[0] == "EXECUTE"):
self.execute(split_line[1])
elif(split_line[0] == "WRITE"):
self.write(self.temp_db, split_line[1], split_line[2])
elif(split_line[0] == "COMMIT"): #Doesnt ever hit true?
continue
elif(split_line[0] == "END"):
break
def t1(self, num):
self.parseTransaction('t1.txt', num, '1')
def t2(self, num):
self.parseTransaction('t2.txt', num, '2')
def t3(self, num):
self.parseTransaction('t3.txt', num, '3')
def t4(self, num):
self.parseTransaction('t4.txt', num, '4')
def t5(self, num):
self.parseTransaction('t5.txt', num, '5')
def t6(self, num):
self.parseTransaction('t6.txt', num, '6')
def serializeTransaction(self):
self.temp_db = self.file
self.t1('1')
self.t2('1')
self.t3('1')
self.t4('1')
self.t5('1')
self.t6('1')
self.temp_db.to_csv(r'C:\Users\laner\Desktop\program 3\database1.txt', sep=',')
self.temp_db = None
def interleave(self):
self.temp_db = self.file
self.temp_db.to_csv(r'C:\Users\laner\Desktop\program 3\database2.txt', sep=',')
def read(self, db, var, indentfier):
row = indentfier[1]
col = indentfier[0]
res = db.at[int(row),col]
if(var == 'y'):
self.y = res
elif(var == 'x'):
self.x = res
elif(var == 'z'):
self.z = res
def execute(self, expression):
varCount = expression.count(expression[0])
var = None
varName = None
if(varCount == 1):
for char in expression:
if(char == 'y'):
var = self.y
varName = 'y'
elif(char == 'x'):
var = self.x
varName = 'x'
elif(char == 'z'):
var = self.z
varName = 'z'
elif(char == '+'):
continue
else:
try:
var += int(char)
except:
pass
if(varName == 'y'):
self.y = int(var)
elif(varName == 'x'):
self.x = int(var)
elif(varName == 'z'):
self.z = int(var)
elif(varCount == 2):
for char in expression:
if(char == 'y' and varName == None):
var = self.y
varName = 'y'
elif(char == 'x' and varName == None):
var = self.x
varName = 'x'
elif(char == 'z' and varName == None):
var = self.z
varName = 'z'
elif(char == varName or char == '+'):
continue
elif(char == 'y' and varName != None):
var += self.y
elif(char == 'x' and varName != None):
var += self.x
elif(char == 'z' and varName != None):
var += self.z
if(varName == 'y'):
self.y = int(var)
elif(varName == 'x'):
self.x = int(var)
elif(varName == 'z'):
self.z = int(var)
def write(self, db, var, identifier):
row = identifier[1]
col = identifier[0]
if(var == 'y'):
db.at[int(row),col] = self.y
self.y = 0
elif(var == 'x'):
db.at[int(row),col] = self.x
self.x = 0
elif(var == 'z'):
db.at[int(row),col] = self.z
self.z = 0
t1-t6 function 用於讀取指定的文件,所以 t1 是我上面粘貼的, t2 看起來像這樣:
START,T2
READ,y,A2
EXECUTE,y+2
WRITE,y,A2
READ,z,B2
READ,x,A3
EXECUTE,x+5
WRITE,x,A3
EXECUTE,z+2
WRITE,z,B2
READ,y,C1
EXECUTE,y+4
READ,z,A1
EXECUTE,z+10
WRITE,z,A1
WRITE,y,C1
READ,x,A3
EXECUTE,x=x+y
WRITE,x,A3
COMMIT
END,T2
總共有 6 個文件,這就是我所在的位置,一次解析 2 個文件,一次一個文件,然后在兩個文件之間循環?
通常,您可以使用itertools.chain
和zip
交錯兩個流。 (類似文件的 object 可以被視為str
值的 stream。)
>>> from itertools import chain
>>> list(chain.from_iterable(zip([1,2,3], "abc")))
[1, 'a', 2, 'b', 3, 'c']
通過簡單地將每個可迭代對象作為單獨的參數傳遞給zip
,這可以以直接字的方式擴展到任意數量的可迭代對象。 您可以定義一個 function 來包裝它:
def interleave(*args):
yield from chain.from_iterable(zip(*args))
for x in interleave("abc", "def", "ghi"):
print(x)
輸出
a
d
g
b
e
h
c
f
i
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.