Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Iterate through 2 files at once performing actions back and forth between the two

Im kind of confused on how to implement this in python, I need to be able to iterate through 6 total files, but 2 files at a time, and read a line from one file, do what that line does, then switch over to read a line from the other file and do what it says, and then vice versa iterating down both files, here is what the files would look like:

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      

and here is my current code which can parse them:

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 is for reading the specified files in, so t1 is what i pasted above and t2 looks similar like this:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

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  

there are 6 of these files in total, so thats where im at, parsing through 2 files at once one file at a time and cycling between the two?

>Solution :

In general, you can interleave two streams using itertools.chain and zip. (A file-like object can be treated as a stream of str values.)

>>> from itertools import chain
>>> list(chain.from_iterable(zip([1,2,3], "abc")))
[1, 'a', 2, 'b', 3, 'c']

This extends to an arbitrary number of iterables in a straight word manner, by simply passing each iterable as a separate argument to zip. You can define a function to wrap this:

def interleave(*args):
    yield from chain.from_iterable(zip(*args))

for x in interleave("abc", "def", "ghi"):
  print(x)

outputs

a
d
g
b
e
h
c
f
i
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading