Leer un archivo línea por línea en Python

Hola. Estoy intentando hacer un ejercicio de Pyhton para abrir un archivo, leerlo línea por línea y luego dividir cada línea en una lista de palabras con la función split e ir agregando cada una de esas palabras a una nueva lista. La cosa es que no entiendo muy bien cómo se hace para actualizar los índices dentro del loop para ir agregando cada nueva palabra a la lista nueva. No sé si me explico…

1 me gusta

Creo que te explicás bien, pero será más claro si nos pasás el código que tenés ahora, y así lo revisamos junt+s, porque hay un montón de formas de hacer esto.

En python un+ por lo general no usa índices directamente, sólo va agregando elementos al final de la lista.

lista = []
entrada = input("Escriba el nombre de un archivo: ")
texto = open(entrada)
TextoRomeo = texto.read()
for linea in TextoRomeo:
    linea = linea.strip()
    siguiente = TextoRomeo.split()
    palabra = siguiente[0] 
    if palabra not in lista:
            lista.append(palabra)
print(sorted(lista))

no sé cómo hacer para poner los indents acá

Para poner código aquí, lo encerrás entre `. En el editor de cada post hay un botón que dice “</> Texto preformateado”. Y también podés hacerlo seleccionando el texto y dándole Ctrl + Shift + C. Probalo :slight_smile:

Ahí edité tu mensaje anterior.

En tu código, uno de los problemas es que texto.read() te lee todo el archivo. Dale print(TextoRomeo) para que lo veás. Entonces, cuando hacés el for por TextoRomeo, va a ir letra por letra, no línea por línea. Miralo así:

texto = open(entrada)
textoEntero = texto.read()
for letra in textoEntero:
    print(letra)

Podés usar readlines para que te devuelva una lista con las líneas, en lugar de un string con todo el texto. Para que veás la diferencia, dale:

texto = open(entrada)
textoRomeoEntero = texto.read()
print(textoRomeoEntero)
texto = open(entrada)
textoRomeoLineas = texto.readlines()
print(textoRomeoLineas)

Tenés otro error porque en palabra = siguiente[0] solo estarías tomando la primera palabra de la línea. Si entiendo bien lo que querés, ahí te hace falta otro for. Pero vamos por partes, primero decime si la diferencia entre read y readlines te queda clara.

ahhh sí, no conocía ese método readlines. Lo probé y entendí la diferencia, sí, gracias. Con lo de palabra = siguiente[0] ahí era donde pensaba usar otro for, sí, y alguna forma de ir actualizando ese índice para cambiar las posiciones. ¿quizás con range?

Probá:

for palabra in linea.split():
   print(palabra)

:exploding_head:

hola, tengo otra duda con este mismo ejercicio. mirá, al final lo terminé haciendo así:

lista = []
entrada = input("Escriba el nombre de un archivo: ")
texto = open(entrada)
for palabra in texto:
    siguiente = palabra.split()
    if siguiente not in lista:
        lista.append(siguiente)
for linea in lista:
    linea.sort()
print(lista)

y todo parece funcionar, excepto por las palabras que empiezan con mayúscula. es decir, me devuelve las palabras ordenadas alfabéticamente, pero las que tienen mayúscula las coloca al inicio de la lista. Entonces, intenté ponerlas en minúscula con el método lower, pero me devuelve error:

lista = []
entrada = input("Escriba el nombre de un archivo: ")
texto = open(entrada)
for palabra in texto:
    siguiente = palabra.split()
    if siguiente not in lista:
        lista.append(siguiente)
for linea in lista:
    linea.lower()
    linea.sort()
print(lista)

entonces, ¿dónde debería poner ese lower() para que funcione?

Decinos qué error te da


AttributeError Traceback (most recent call last)
in
7 lista.append(siguiente)
8 for linea in lista:
----> 9 linea.lower()
10 linea.sort()
11 print(lista)

AttributeError: ‘list’ object has no attribute ‘lower’

Ok, lower es un metodo de string, no de lista.

Tal vez podés hacer algo como:

for palabra in texto:
    siguiente = palabra.lower().split()

Pero creo que no es necesario. Hay algunas cosas que serían más claras nombrandolas mejor. Por ejemplo, al hacer un for por texto, lo que recibís en cada iteración es una línea, no una palabra. Lo que llamás siguiente es una lista de palabras. Cuando querés agregar una lista a otra, podés usar extend.

¿Qué te parece algo así?

lista = []
texto = open(entrada)

for linea in texto:
    palabras = linea.split()
    lista.extend(palabras)

lista.sort()
print(lista)

¿pero ahí no sucedería lo mismo de que si hay palabras que empiezan en mayúscula esas se colocarían al inicio de la lista y luego las otras en minúscula sí se ordenarían alfabéticamente? la cosa es que yo estoy tratando de ordenarlas todas alfabéticamente y las que empiezan con mayúscula se salen de ese orden porque empiezan con mayúscula

Pos sí. Entonces agregás uno más dentro del for:

linea_minuscula = linea.lower()
palabras = linea_minuscula.split()

vieras que… sigue devolviendo las palabras con mayúscula inicial :frowning:

creo que lo logré, aunque no sé qué tan poco elegante quedó jeje.

lista = []
entrada = input("Escriba el nombre de un archivo: ")
texto = open(entrada)
for linea in textoRomeo:
    palabra = linea.split()
    for masPalabras in palabra:
        ordenar = masPalabras.lower()
        if ordenar not in lista:
            lista.append(ordenar)
print(sorted(lista))
1 me gusta

Ah claro, mi ejemplo no fltraba lar palabras repetidas. No se por qué tampoco las hacía minúscula :man_shrugging: algun bug.

Tu solucion no se ve mal, y si funciona, genial :100: :smiley:

¿qué significa eso de algún bug?

Le llamamos bugs a los errores que cometemos en nuestro código. Siempre hay.

Lo que hicimos cuando nos juntamos fue debug, o depurar. Recorrer el programa paso a paso en busca de bugs.

Hay una historia linda de Grace Hopper que encontró una polilla en su código fuente. Un bug muy literal.

1 me gusta