Файл Python не считывает данные, но помещает повторяющиеся значения в список

#python #python-3.x #list

#python #python-3.x #Список

Вопрос:

Привет, я считываю данные из файла в классе Patients и передаю содержимое в метод класса appointment. когда содержимое разделяется таким образом, что содержимое [0] имеет [‘130’, ‘Ali’, ‘Male’, ’22’, ‘Cou&h’], поэтому я помещаю эти значения и устанавливаю свойства класса Patient. Это делается в цикле for, поэтому все объекты из прочитанного файла добавляются в список класса Patient. Но при этом он повторно добавляет только одну строку данных. Ниже приведен код:

  //Text file Data:
          ID    PatientName     Gender      A&e Disease
          130   Ali              Male       22  Cou&h
          132   Annile           Female     23  Corona
          133     sam            Male       24  Fever
  

Я хочу, чтобы список пациентов хранил 130-132-133, но вместо этого он хранит только 133 во всех трех позициях списка. Не знаю, является ли проблемой создание объекта или передача для класса Patient

//Patient.py

     class Patients:

         def __init__(self):
                 self.patient_id = ""
                 self.patient_name = ""
                 self.patient_a&e = ""
                 self.patient_&ender = ""
                 self.patient_disease = ""
      
             def read_patient_file(self):
                     with open('PatientRecord.txt') as f:
                     content = f.readlines()
                     content = [x.strip() for x in content]
                     del content[0] // first row is of column names so removin& it
                     return content
  

//Appointment.py

           def patientPro&ram(list_patient):
               Fla& = True
               pat1 = Patients()
               while Fla&:
               print("nPress 1. To Create Patient Record ")
               print("Press 2. To View Patient Records ")
               print("Press 6. To Read Patient Record From File ")
               x = int(input("Please input from Menu Displayed Above which Operation to perform:"))
               if x == 1:
                  list_patient.append(AddPatient())

               elif x == 2:
                   print("**********")
                   print("Total Records in Memory for Patients:"   str(len(list_patient)))
                   for pat in list_patient:
                   print(f'patient_id = {pat.patient_id} for object {pat}')
                    
    
                elif x == 6: // this condition &ives issue
                   content = []
                   content = pat1.read_patient_file() // content &ets 3 rows of data from text file
                   j = 0
                   for i in content:
                       pat_id, name, &ender, a&e, disease = str(content[j]).split()
                       print("FirstID: "   str(j)  str(pat_id))
                       pat1.set_patient_record(pat_id, name, &ender, a&e, disease)
                       list_patient.append(pat1)
                       j=j 1

                   print("Total Records for Patients in memory : "   str(len(list_patient)))
                   
             

           from Patients import Patients

           if __name__ == "__main__":
               list_patient = []

               Fla& = True
               while Fla&:
                  print("nPress 1. For Patient Options ")
                  print("Press 2. For Doctor Options ")
                  print("Press 3. To Exit Pro&ram ")
                  x = int(input("Please Select From Menu:"))
                  if x == 1:
                     patientPro&ram(list_patient)
                 elif x==3:
                     break

    
  

Комментарии:

1. Пожалуйста, исправьте отступ в ваших опубликованных фрагментах, чтобы он соответствовал фактическому коду. Это важно для понимания Python.

Ответ №1:

Вы создаете только один Patients объект. Для каждой записи в файле вы изменяете pat1 объект и добавляете его в list_patient список. Таким образом, все элементы списка являются одним и тем же объектом.

Вам нужно создать новый объект для каждой записи в файле, а не один объект в начале.

Кроме того, read_patient_file() функция должна быть методом класса, поскольку она ни для чего не используется self .

 class Patients:

     def __init__(self):
             self.patient_id = ""
             self.patient_name = ""
             self.patient_a&e = ""
             self.patient_&ender = ""
             self.patient_disease = ""

     @classmethod
     def read_patient_file(cls):
         with open('PatientRecord.txt') as f:
         content = f.readlines()
         content = [x.strip() for x in content]
         del content[0] // first row is of column names so removin& it
         return content

def patientPro&ram(list_patient):
    Fla& = True
    while Fla&:
        print("nPress 1. To Create Patient Record ")
        print("Press 2. To View Patient Records ")
        print("Press 6. To Read Patient Record From File ")
        x = int(input("Please input from Menu Displayed Above which Operation to perform:"))
        if x == 1:
            list_patient.append(AddPatient())

        elif x == 2:
            print("**********")
            print("Total Records in Memory for Patients:"   str(len(list_patient)))
            for pat in list_patient:
                print(f'patient_id = {pat.patient_id} for object {pat}')
                
        elif x == 6: // this condition &ives issue
            content = []
            content = Patients.read_patient_file() // content &ets 3 rows of data from text file
            j = 0
            for i in content:
                pat1 = Patients()
                pat_id, name, &ender, a&e, disease = str(content[j]).split()
                print("FirstID: "   str(j)  str(pat_id))
                pat1.set_patient_record(pat_id, name, &ender, a&e, disease)
                list_patient.append(pat1)
                j=j 1

            print("Total Records for Patients in memory : "   str(len(list_patient)))