Mi código se encuentra con un AttributeError y no sé cómo solucionarlo

Esta es mi clase:

class Reservation:

    def __init__(self, passengerName, departureCity, destinationCity, dateOfTravel, timeOfTravel, numberOfTickets):
        self.passengerName = passengerName
        self.departureCity = departureCity
        self.destinationCity = destinationCity
        self.dateOfTravel = dateOfTravel
        self.timeOfTravel = timeOfTravel
        self.numberOfTickets = numberOfTickets

reservationList = list()
with open("reservation.txt", "w") as file:

    for reservation in reservationList:
        reservation.write(reservation.passengerName + "," + reservation.departureCity + "," + reservation.destinationCity +
                            "," + reservation.dateOfTravel + "," + reservation.timeOfTravel + "," +
                            str(reservation.numberOfTickets) + "\n")

    file.close()
File "C:/Users//Desktop/pld/ticket_reservation5.py", line 183, in <module>
    main()
  File "C:/Users//Desktop/pld/ticket_reservation5.py", line 176, in main
    reservation.write(reservation.passengerName + "," + reservation.departureCity + "," + reservation.destinationCity +
AttributeError: type object 'Reservation' has no attribute 'write'
-2
lés 8 oct. 2019 a las 18:05

3 respuestas

La mejor respuesta

Sus objetos de reserva individuales no tienen atributos de escritura. Desea llamar al método de escritura del archivo y utilizar los datos del objeto para completar la cadena.

with open("reservation.txt", "w") as file_:
    for reservation in reservationList:
        file_.write(reservation.passengerName + .... + "\n")

Nota al margen, dado que está utilizando un administrador de contexto (con open () como _), no tiene que hacer file.close(). El gerente lo hará por usted.

Además, file es una función incorporada, por lo que no desea sobrescribir eso. Deberá agregar un guión bajo al nombre de la variable para diferenciarlo como se describe en PEP8

1
Jtcruthers 8 oct. 2019 a las 15:13

La reserva es solo un iterador para recorrer la lista de la lista de reserva, no tiene ninguna función de escritura definida. Hay tres formas de leer datos de un archivo de texto.

read() : Returns the read bytes in form of a string. Reads n bytes, if no n specified, reads the entire file.

File_object.read([n])

readline() : Reads a line of the file and returns in form of a string.For specified n, reads at most n bytes. However, does not reads more than one line, even if n exceeds the length of the line.

File_object.readline([n])

readlines() : Reads all the lines and return them as each line a string element in a list.

  File_object.readlines()

Aquí hay un ejemplo para abrir un archivo y leerlo:

file1 = open("myfile.txt","r") 
print(file1.read()) 
print(file1.readline()) 
0
ayush raj 8 oct. 2019 a las 15:47

Hazlo así y asegúrate de que tu última cadena en tu lista tenga un \n para que cada vez que un usuario diferente ingrese información que escriba en una nueva línea:

with open("file_name.txt", 'a') as f: # "a" is used to append data to a file that is it
# does not delete previously written data instead appends to it also f is the variable 
# which stores the file and could be anything
    for reservation in reservationList:
        f.write(reservation)
    print("done")
0
uravgcodddingnoob 9 oct. 2019 a las 10:10
58289119