Acabo de comenzar a aprender clases en Python y tengo un problema con ellas.

Tengo un archivo txt con las siguientes líneas:

3 37.5 200

6 36.9 200

9 36.6 100

12 36.6 0

Cuando ejecuto el siguiente código, solo imprime la primera línea. Sin embargo, me gustaría recuperar todas las líneas. Sé que puede usar print(), pero ¿es posible regresar?

class Meds:

    def __init__(self, file):
        self.file = file

    def meds(self):
        for i in source.readlines():
            data_split = i.strip().split(' ')

            hour = data_split[0]
            temp = data_split[1]
            dose = data_split[2]

            return 'At {0}:00 - he had {1} temp, and took {2} mg of meds'.format(hour, temp, dose)

if __name__ == '__main__':
    source = open('meds.txt', 'r', encoding='utf8')

    a = Meds(source)
    print(a.meds())

    source.close()

Realmente agradecería ayuda en esto y sería increíblemente feliz si puede proporcionar buenas fuentes, claras que explican las clases en Python.

1
Jasmont 13 ene. 2017 a las 20:02

3 respuestas

La mejor respuesta

readlines() devuelve TODAS las líneas en el archivo. Desea utilizar readline() en su lugar.

Parece que estás iterando a través de source en lugar de self.file. Regresas del método meds() que también ha pasado por una sola línea. También puede recorrer directamente el objeto del archivo. Con eso en mente, su función de bucle podría verse así:

for line in self.file:
    data_split = i.strip().split(' ')
    hour = data_split[0]
    temp = data_split[1]
    dose = data_split[2]
    yield 'At {0}:00 - he had {1} temp, and took {2} mg of meds'.format(hour, temp, dose)

En su código que llama a meds(), puede usar lo siguiente:

for med in a.meds():
    print(med)

Para más información, consulte la documentación aquí .

1
Thelmund 13 ene. 2017 a las 17:44

Podrías reescribir tu código de la siguiente manera:

class Meds:

    def __init__(self, file):
        self.file = file

    def meds(self):
        for i in self.file.readlines():
            data_split = i.strip().split(' ')

            hour = data_split[0]
            temp = data_split[1]
            dose = data_split[2]

            yield 'At {0}:00 - he had {1} temp, and took {2} mg of meds'.format(hour, temp, dose)


source = open('meds.txt', 'r', encoding='utf8')

a = Meds(source)
print(list(a.meds()))

source.close()

En este caso, utilizará el generador generador.

0
Copperfield 13 ene. 2017 a las 20:46

Su clase Meds tiene dos métodos, uno de los cuales es __init__ y el otro es meds.

Entonces no es una clase sino una función disfrazada.

No todos los problemas de programación pueden y deben resolverse escribiendo clases.

def meds(path):
    with open(path) as medsfile:
        data = [tuple(float(k) for k in ln.split())
                for ln in medsfile if len(ln.strip()) > 0]
    return data

Ejecutar esto en sus datos de entrada devuelve una lista de tuplas:

In [4]: meds('meds.txt')
Out[4]: [(3.0, 37.5, 200.0), (6.0, 36.9, 200.0), (9.0, 36.6, 100.0), (12.0, 36.6, 0.0)]
1
Roland Smith 13 ene. 2017 a las 22:30