#python #file #object
#python #файл #объект
Вопрос:
Мне нужно использовать класс ‘Student’ с 5 переменными и создавать объекты, используя более одного файла.
Текстовые файлы: (Students.txt )
Last Name Midle Name First Name Student ID
----------------------------------------------
Howard Moe howar1m
Howard Curly howar1c
Fine Lary fine1l
Howard Shemp howar1s
Besser Joe besse1j
DeRita Joe Curly derit1cj
Tiure Desilijic Jaba tiure1jd
Tharen Bria thare1b
Tai Besadii Durga tai1db
Текстовый файл 2: (CourseEnrollment.txt )
PH03
----
fine1l
howar1s
besse1j
derit1cj
tiure1jd
targa1d
bomba1t
brand1m
took1p
mccoy1l
solo1h
edrie1m
mccoy1e
adama1l
grays1z
MT03
----
cottl1s
fine1l
clega1s
targa1d
took1p
mccoy1l
crush1w
dane1a
monto1i
rugen1t
talto1v
watso1j
carpe1m
rosli1l
biggs1gj
tigh1e
PH05
----
zarek1t
adama1w
tigh1s
cottl1s
howar1m
howar1s
besse1j
balta1g
derit1cj
thare1b
hego1d
lanni1t
stark1a
clega1s
scott1m
monto1i
flaum1e
watso1j
biggs1gj
dane1a
EN01
----
howar1c
fine1l
tai1db
targa1d
brand1m
corey1c
edrie1m
watso1j
carpe1m
sobch1w
EN02
----
howar1m
howar1s
besse1j
tiure1jd
tai1db
hego1d
lanni1t
stark1a
mccoy1l
scott1m
crush1w
dane1a
monto1i
rugen1t
solo1h
flaum1e
talto1v
watso1j
mccoy1e
CS02
----
howar1m
howar1c
besse1j
derit1cj
thare1b
hego1d
clega1s
targa1d
brand1m
rugen1t
flaum1e
talto1v
mccoy1e
grube1h
AR00
----
tigh1e
rosli1l
murph1a
grays1z
howar1c
howar1s
tiure1jd
thare1b
lanni1t
clega1s
bomba1t
balta1g
brand1m
took1p
crush1w
corey1c
edrie1m
grube1h
sobch1w
MT01
----
derit1cj
tai1db
hego1d
stark1a
bomba1t
took1p
scott1m
crush1w
grube1h
rugen1t
solo1h
corey1c
flaum1e
talto1v
mccoy1e
carpe1m
sobch1w
CS01
----
howar1m
howar1c
fine1l
tiure1jd
thare1b
tai1db
lanni1t
stark1a
bomba1t
mccoy1l
monto1i
solo1h
biggs1gj
corey1c
edrie1m
carpe1m
CS05
----
grays1z
adama1w
adama1l
rosli1l
balta1g
tigh1e
tigh1s
cottl1s
zarek1t
murph1a
sobch1w
dane1a
EN08
----
grays1z
adama1w
adama1l
rosli1l
balta1g
tigh1e
tigh1s
cottl1s
zarek1t
murph1a
grube1h
biggs1gj
OT02
----
adama1w
adama1l
tigh1s
scott1m
zarek1t
murph1a
Мне нужно прочитать в текстовых файлах, чтобы создать объекты Student, используя оба файла и класс ‘Student’.
Класс является:
class Student (object):
def __init__(self, first_name, middle_name, last_name, student_id, enrolled_courses):
"""Initialization method"""
self.first_name = first_name
self.middle_name = middle_name
self.last_name = last_name
self.student_id = student_id
self.enrolled_courses = enrolled_courses
и в основном методе у меня есть:
if __name__ == '__main__':
list_of_students = []
with open('Students.txt') as f:
for line in f:
data = line.split()
if len(data) == 3:
first_name, last_name, student_id = data
list_of_students.append(Student(last_name, '', first_name, student_id))
elif len(data) == 4:
list_of_students.append(Student(*data))
else:
continue
Когда я запускаю программу без enrolled_courses
переменной и читаю только в ‘Students.txt ‘, он работает идеально и создает Student
объекты с помощью first_name
, middle_name
, last_name
и student_id
. Тем не менее, мне все еще нужно использовать добавить enrolled_courses
переменную к объектам и получить ее из ‘EnrolledCourses.txt ‘. Как я могу прочитать оба файла и назначить переменные объектам, которые я пытаюсь создать?
Ответ №1:
Сначала прочитайте своего студента / курс и создайте словарь: ключ = студент, значение = список курсов
Формат странный, но приведенный ниже код был протестирован и работает (возможно, не так надежно, как следовало бы). Прочитайте построчно, сначала курс и список студентов. Добавить в словарь (создать пустой список, если ключ не существует, это делает nice defaultdict
object):
from collections import defaultdict
student_course = defaultdict(list)
with open("CourseEnrollment.txt") as enr:
while True:
try:
course_name = next(enr).strip()
next(enr) # skip dashes
while True:
student = next(enr).strip()
if student=="":
break
student_course[student].append(course_name)
except StopIteration:
break
и в вашем коде вызывайте Student
конструктор следующим образом:
list_of_students.append(Student(last_name, '', first_name, student_id, student_course[student_id]))