我對如何在 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 函式用于讀取指定的檔案,所以 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 個檔案,一次一個檔案,然后在兩者之間回圈?
uj5u.com熱心網友回復:
通常,您可以使用itertools.chain和交錯兩個流zip。(類似檔案的物件可以被視為一個str值流。)
>>> from itertools import chain
>>> list(chain.from_iterable(zip([1,2,3], "abc")))
[1, 'a', 2, 'b', 3, 'c']
通過簡單地將每個可迭代物件作為單獨的引數傳遞給 ,這可以直接擴展到任意數量的可迭代物件zip。您可以定義一個函式來包裝它:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/372437.html
