Trabajando con archivos de texto en Python
Clase 19 de 21 • Curso de Python Intermedio: Comprehensions, Lambdas y Manejo de Errores
Contenido del curso
Clase 19 de 21 • Curso de Python Intermedio: Comprehensions, Lambdas y Manejo de Errores
Contenido del curso
Eber Lopez
Nicolas Vargas
Sebastián Andrade
Miguel Angel Reyes Moreno
Moisés Manuel Morín Hevia
Marcelo Alejandro Palma Brach
Urdinola Ivan Alberto
Celic Aislinn Liahut Ley
Moisés Manuel Morín Hevia
Alejandro Aguilar
Kevin Harold Gutierrez Ramirez
Carlos Daniel Rodriguez
Andrés Suarez
Carlos Rodríguez
Daniel Paloma Murcia
Moisés Manuel Morín Hevia
Cristian Camilo Hernández Ramirez
Enzo Venturi
Miguel Góngora
Juan Pablo Cuenca Ludeña
Alejandro Castaño Vargas
William Ricardo Vargas Acero
Jhon Stiven León
Juan Pablo Cuenca Ludeña
Andrés Felipe Lopez gomez
José Alejandro Llamas
José Martínez Santana
Diego Alexander Ariza Arenas
Sergio Ivan Santacruz Madrigal
Diego Alexander Ariza Arenas
Royer Guerrero Pinilla
Raul Andres Herrera Larrarte
Horacio Gaido
Usuario anónimo
Leiber Bertel
Marco Antonio Baquero Torres
Andres Alonso Huamani Marquez
Sebastian vier
Nelson Ricardo Ramírez García
Andrés Felipe Lopez gomez
Carlos A. Lobo R.
Mario Alberto García Meza
Jose Antonio Rojas Ollarves
Moisés Manuel Morín Hevia
Luis Fernandez
Fernando Campos
Luis Fernandez
def read(): names = [] with open("./archivos/name.txt", "r", encoding="utf-8") as f: for line in f: if len(line.strip()) > 0: names.append(line.strip()) if len(names)> 0: print(names) else: print("Archivo vacio") def write(): names = [] with open("./archivos/name.txt", "w" , encoding="utf-8") as f: for name in names: f.write(name) f.write('\n') def agregar_nombre(nombre): with open("./archivos/name.txt", "a" , encoding="utf-8") as f: f.write(nombre) f.write("\n") def borrar_nombre(nombre): names = [] with open("./archivos/name.txt", "r", encoding="utf-8") as f: for line in f: if len(line.strip()) > 0 and line.strip()!= nombre: names.append(line.strip()) with open("./archivos/name.txt", "w" , encoding="utf-8") as f: for name in names: f.write(name) f.write('\n') def run(): sw = True while sw: try: print(""" ---------------------------------------------------------------------- Seleccione un numero: 1. Crear un nuevo archivo 2. Agregar nombre 3. Listar nombre 4. Borrar nombre 5. Salir del programa ---------------------------------------------------------------------- """) n = int(input("Ingrese una opcion : ")) if n == 1: write() elif n == 2: nombre = input("Ingrese el nombre a agregar: ") agregar_nombre(nombre) elif n == 3: read() elif n == 4: nombre = input("Ingrese el nombre a borrar : ") borrar_nombre(nombre) elif n ==5: sw = False print("Programa Terminado!") except ValueError : print("Error seleccione una opcion correcta") # write() if __name__ == '__main__': run()
Felicitaciones, se nota tu dedicacion y lo profecional que eres. Muchas gracias por tu aporte, me ayudo mucho. <3
bastante bien, felicitaciones y gracias por el aporte
encoding = "utf-8" Sirve para que Python pueda soportar caracteres del idioma español, como la "ñ" y letras con tilde.
Sí, cada lengua tiene su encoding.
A mi me soporta hasta los emojis, aunque no le especifique enconding="16", en lugar de eso le puse enconding="8" 🤔
Compañeros si tienen un problema con la ruta del archivo, les recomiendo algo que me funcionó:
with open('./venv/archivos/numbers.txt, 'r', encoding = 'utf-8) as f:
Muchas gracias , me sirvió mucho <3 :)
Thanks.
Encuentro muy útil hacer una constante que defina la ruta absoluta del script para poder ejecutarlo desde cualquier lado (van a notar que si se ejecuta desde otro lado, la ruta "./archivos/numbers.txt" ya no sirve), esto sería, así:
import os FILE_PATH=os.path.dirname(__file__) def read(): numbers = [] with open(f"{FILE_PATH}/archivos/numbers.txt", "r", encoding="utf-8") as f: [numbers.append(int(line)) for line in f] print(numbers)
Si alguien tiene otra sugerencia, agradecería su comentario :D
Gracias <3
Gracias amigo! Me re sirvió
Un pequeño aporte, cuando estén trabajando con datos y tengan su .csv con los decimales en , y no . en: with open("./archivos/numeros.csv", "r", encoding="utf-8", decimal=",") as f con añadir decimal="," no tendrán que editar nada y pasan a procesar sus datos de inmediato.
Saludos a todos
Genial.
En la funcion write() es buena práctica poner f.close() despues del ciclo for, para cerrar el archivo y no perder informacion.
Lo tendré en cuenta, gracias.
Creo que al usar el context manager (with), él siempre cierra el archivo por nosotros y no hay necesidad de cerrarlo manualmente.
Porque cuando no usas el context manager, tienes que cerrarlo así:
f = open("/path/file.txt", "r") f.write('something') f.close()
Les dejo la manera de como hacerlo con list comprehensions:
numbers_txt = [int(line) for line in f] names_txt = [f.write(name + "\n") for name in names]
Excelente aporte
Muy buena, utilización, no sabía que se podían usar las list comprehensions como una especie de iterador, aunque puede generar listas con valores booleanos o incluso None
Por ejemplo:
unused_list = [ print(i) for i in range(5)] # Imprime los números del 0 al 4 # unused_list = [ None, None, None, None, None]
Tuve un problema con la ubicación del archivo, VSC no la reconocía y la tomaba como FileNotFoundError, es decir, como si no existiera. Lo solucioné agregando
def read(): numbers = [] with open(r"C:\Users\alejandro\Documents\Visual Studio Code\Python\Manejo archivos\carpeta\numbers.txt" , "r") as f:
Me sirvió, sin esa r no me corre el programa. Muchas gracias.
Les recomiendo la siguiente extensión para VSCode la cúal nos permite ubicar un archivo de una manera un poquito más cómoda, los invito a probarla
Muy buena, veía que a Facundo le funcionaba, pero a mi no. GRACIAS
Gracias
Para los que no nos corrió el código en un inicio, acuérdense de sustituir el pass dentro de run() y colocar el nombre de la función que deseen imprimir en pantalla.
Para que sea más elegante en la función de escritura, sólo hay que concatenar la constante de nueva línea:
for name in names: f.write(name + '\n')
Estoy teniendo un problema con el open, mi código es:
def read(): numbers = [] with open("./archivos/numbers.txt", "r") as f: for line in f: numbers.append(int(line)) print(numbers)
Pero no imprime nada en pantalla. ¿Alguien sabe cuál sea el problema?
También intento hacer el :
.... for line in f: print(line)
Y no funciona
Aunque no esta todo el código creo puede ser que no agregaste la ultima parte, ya que no visualizas nada.
La primera opción, puedes validar con el Debugger de VSC.
La segunda, te comparto mi ejercicio, tal vez te ayude a encontrar el problema:
def read(): numbers = [] with open("./files/numbers.txt", "r", encoding="utf-8") as f: for line in f: numbers.append(int(line)) print(numbers) def write(): names = ["sergio", "laura", "pepe", "chistian"] with open("./files/names.txt", "w", encoding="utf-8") as f: for name in names: f.write(name) f.write("\n") def run(): # read() write() if __name__ == "__main__": run()
Hola Sergio, ha funcionado, graciassss!!
Faltaba poner en el run la función que quería ejecutar, error muy simple pero muy importante línea dentro del código!!!
Recurso de estudio
File Handling in Python
Gracias por tus valiosos aportes.
Muchas gracias!!! Excelente recurso. También comparto este recurso
✨ Es importante cerrar nuestro archivo, después de trabajar con el.
archivo.close()
Creo que al usar el context manager (with), él siempre cierra el archivo por nosotros y no hay necesidad de cerrarlo manualmente.
Porque cuando no usas el context manager, tienes que cerrarlo así:
f = open("/path/file.txt", "r") f.write('something') f.close()
Hola, hice el ejercicio agrgandole una comprobacion al archivo de texto para que no salga ningun error en caso que contenga saltos de linea, espacios en blanco o algo que no sean numeros. Lo hice agregando if line.isspace() or line.isalpha(): Los metodos isspace verifica que no sea un espacio o salto de linea y el metodo isalpha verifica si es texto, en cuyo caso se salta esa ejecucion en el cliclo for mediante la instruccion continue.
def read(): numbers = [] with open('./archivos/numbers.txt', 'r', encoding = 'utf-8') as f: for line in f: if line.isspace() or line.isalpha(): continue numbers.append(int(line)) print(numbers) def write(): names = ['Pepe', 'Marcela', 'Fredy', 'Juan', 'Ana', 'Mara'] with open('./archivos/names.txt', 'a', encoding='utf-8') as f: for name in names: f.write(name) f.write('\n') def run(): read() write() if __name__ == '__main__': run()
excelente aporte... Gracias!
Hay un truco que se puede hacer cuando tienes una lista con muchos nombres y no quieres escribir tantas comillas:
names = "Paco Miguel Pepe Facundo Sebastian".split()
¡Gracias! 👍👍
Muchas gracias
Una forma alternativa de escribir el archivo usando lo aprendido hasta ahora, con ++lambda functions++ y ++list comprehensions++
with open("./files/names", "w", encoding="utf-8") as f: list(map(lambda name: f.write(name+"\n") , [name for name in names]))
Eso es una de las mayores ventajas de Platzi. He aprendido por muchos medios. La mayoría en inglés. Esto significa que se suelen pasar el encoding como algo innecesario. Pero si trabajas con archivos con datos en español, necesitas saber sobre encoding.
TIP Cuando coloca as "f" realmente lo que esta haciendo es una convencion es una forma de tener buenas practicas al momento de trabajar con archivos en python.
Quiero tener buenas prácticas.
En el examen preguntan que se usa para escribir una linea en un archivo de texto, y segun esto la respuesta correcta es write(), esto me parece que no es correcto, es decir, en el programa que hace Facundo es correcto, pero Yo le puedo poner el nombre que quiera, hubiese podido ser Piolin() y eso tambien escribe si es que lo programe asi, quizas es correcto se la respuesta es w, o algo asi, pero no creo que write() sea correcto, sino me tienes que hablar especifico del ejemplo de la leccion
Hola 👋🏼
Estás confundiendo el nombre del método para escribir con el nombre con el que declaras la variable del archivo.
El nombre que le das a la variable del archivo sí es totalmente a tu decisión puede ser file o piolin o cualquier otro. Por otro lado, el método de esa variable para poder escribir si es write().
Para escribir usarías algo así. file.write() o piolin.write()
Gracias!!!