3

I have a text file in this format,

0
1
2 2 9
3 2 9
0
2
2 1 9
3 1 9
0
3
2 5 -6
4 1 -6
0
4
2 1 13
4 2 6

I have two Python Classes which are as follows,

class Timetable:
    def __init__(self):
        self.id = ""
        self.slot = []

class slots:
    def __init__(self):
        self.day = 0
        self.slot = 0
        self.room = 0

In my text file, 0 acts as the separator value, that is it separates different data from each other.

1
2 2 9
3 2 9

In this, 1 represents the "ID" of the class and the next two are the the slots of the this class in the timetable. In case of "2 2 9", it means that the first lecture of Class "1" will be held on "Tuesday, 2nd slot, in room number 9"

I want to store all this data in my classes.

For example, in this case, I want a Timetable object in which the ID will have "1".

and the slots will be an array of two objects of "slots". Each slot will have a day (in this case, it will be 2), a slot (in this case, it will be 2) and the room (in this case, it will be 9).

I am able to read the data, but I am unable to differentiate different data with each other. I can use the "0" as a separator to differentiate between two classes but I am unable to differentiate the two slots now.

In C++, it would have been very easy, i.e. I can easily hardcode it in such a way that first digit is read as the ID of class. Next three digits will create first object of slot and the next three will create second object of slot, and so on until all the file is read.

But, I am unable to make the logic for doing the same in Python. Can anyone kindly help me in doing this? Thank you.

2
  • 2
    What, exactly, have you tried? Commented Sep 30, 2021 at 19:59
  • 2
    You can first split it with split('0'), then split it again with '\n' or ' ' Commented Sep 30, 2021 at 20:03

2 Answers 2

1

See below

class Timetable:
    def __init__(self,id,slots):
        self.id = id
        self.slots = slots
    def __repr__(self) -> str:
        return f'Timetable: {self.id} {self.slots}'

class Slot:
    def __init__(self,day,slot,room):
        self.day  = day
        self.slot =  slot
        self.room = room
    def __repr__(self) -> str:
        return f' Slot: {self.day} {self.slot} {self.room}'
data = []
inside_tt = False
with open('data.txt') as f:
    lst = []
    for line in f:
        line = line.strip()
        if line == '0':
            if not inside_tt:
                inside_tt = True
            else:
                data.append(Timetable(id,lst))
                lst =[]
            next_is_id = True
            continue
        if inside_tt:
            if next_is_id:
                id = line
                next_is_id = False
            else:
                tmp = line.split()
                lst.append(Slot(tmp[0],tmp[1],tmp[2]))
data.append(Timetable(id,lst))
print(f'data: {data}')

output

data: [Timetable: 1 [ Slot: 2 2 9,  Slot: 3 2 9], Timetable: 2 [ Slot: 2 1 9,  Slot: 3 1 9], Timetable: 3 [ Slot: 2 5 -6,  Slot: 4 1 -6], Timetable: 4 [ Slot: 2 1 13,  Slot: 4 2 6]]
Sign up to request clarification or add additional context in comments.

3 Comments

for line in f.readlines(): no. Use for line in f:
Oops. That is correct. I will fix it
@juanpa.arrivillaga code was fixed. Thanks for pointing to this "bug".
1

You can hardcode in python as you do in C++. This way -

# Let f be file
# Assuming you know how to separate using seperator 0

# reads id. eg. id = 1
id = int(f.readline().strip()) 
# t1 stores list of int values. eg. t1 = [2, 2, 9]
t1 = list(map(int, f.readline().strip().split())) 
# t2 stores list of int values. eg. t1 = [3, 2, 9]
t2 = list(map(int, f.readline().strip().split())) 

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.