簡體   English   中英

一次遍歷 2 個文件,在這兩個文件之間來回執行操作

[英]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.chainzip交錯兩個流。 (類似文件的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM