You've already forked Curso-lenguaje-python
Restructure content and add notes from HolaMundo
Signed-off-by: Manuel Vergara <manuel@vergaracarmona.es>
This commit is contained in:
73
python-total/dia_06/01_abrir_manipular_archivos.py
Normal file
73
python-total/dia_06/01_abrir_manipular_archivos.py
Normal file
@@ -0,0 +1,73 @@
|
||||
"""
|
||||
Abrir y manipular archivos
|
||||
"""
|
||||
# Abrir documento
|
||||
archivo = open('prueba.txt')
|
||||
|
||||
# Leer todo el documento
|
||||
archivo_total = archivo.read()
|
||||
|
||||
# print(archivo_total)
|
||||
print(archivo_total)
|
||||
archivo.close()
|
||||
|
||||
print('-'*25)
|
||||
|
||||
# Con este método se lee una sola línea
|
||||
mi_archivo = open('prueba.txt')
|
||||
una_linea = mi_archivo.readline()
|
||||
|
||||
print(una_linea.upper())
|
||||
print(una_linea)
|
||||
|
||||
una_linea = mi_archivo.readline()
|
||||
|
||||
# Con el método rstrip no se efectuará salto de línea
|
||||
print(una_linea.rstrip())
|
||||
una_linea = mi_archivo.readline()
|
||||
|
||||
print(una_linea)
|
||||
# close cierrar el archivo para no ocupar
|
||||
# el espacio de memoria que deja abierto en open.
|
||||
# Es importante usarlo siempre
|
||||
mi_archivo.close()
|
||||
|
||||
print('-'*25)
|
||||
|
||||
archivo2 = open('prueba.txt')
|
||||
# Se puede iterar por líneas
|
||||
for l in archivo2:
|
||||
print('Aquí dice que : ' + l)
|
||||
|
||||
archivo2.close()
|
||||
|
||||
print('-'*25)
|
||||
|
||||
arch = open('prueba.txt')
|
||||
# Con este método se meten las líneas en una lista.
|
||||
# Hay que tener en cuenta que estos métodos que cargan
|
||||
# todo el archivo deben usarse con modelación,
|
||||
# ya que cargan mucho la memoria sobretodo si son
|
||||
# ficheros grandes y el mismo muchas veces.
|
||||
todas = arch.readlines()
|
||||
|
||||
print(todas)
|
||||
|
||||
|
||||
arch.close()
|
||||
|
||||
print('-'*25)
|
||||
|
||||
# Imprimir la segunda linea
|
||||
txt = open('prueba.txt')
|
||||
|
||||
list_txt = txt.readlines()
|
||||
|
||||
cuenta_lineas = 0
|
||||
for l in list_txt:
|
||||
cuenta_lineas += 1
|
||||
if cuenta_lineas == 2:
|
||||
print(l)
|
||||
|
||||
print()
|
||||
txt.close()
|
||||
21
python-total/dia_06/02_crear_escribir_archivos.py
Normal file
21
python-total/dia_06/02_crear_escribir_archivos.py
Normal file
@@ -0,0 +1,21 @@
|
||||
"""
|
||||
Crear y escribir archivos
|
||||
|
||||
Sintaxis:
|
||||
mi_archivo = open('archivo.txt',modo_apetura)
|
||||
Argumentos de open()
|
||||
r - Solo lectura - Por defecto
|
||||
w - Solo escritura. Si el archivo ya existe se resetea
|
||||
a - Añadir excritura, se posiciona al final.
|
||||
x - Creación
|
||||
|
||||
2 Métodos de escritura
|
||||
write() Para escribir normal
|
||||
writelines Para añadir texto en lista
|
||||
"""
|
||||
|
||||
mi_archivo = open('prueba.txt', 'w')
|
||||
mi_archivo.write('\nEste texto se escribe desde python\n')
|
||||
mi_archivo.writelines(['Hola', 'mundo', 'aquí', 'estoy'])
|
||||
|
||||
mi_archivo.close()
|
||||
58
python-total/dia_06/03_directorios.py
Normal file
58
python-total/dia_06/03_directorios.py
Normal file
@@ -0,0 +1,58 @@
|
||||
"""
|
||||
Directorios
|
||||
|
||||
Importaremos dos librerias:
|
||||
Path de pathlib
|
||||
os
|
||||
"""
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
# Obtener el directorio de trabajo actual
|
||||
ruta = os.getcwd()
|
||||
print(ruta)
|
||||
|
||||
# Cambiar de directorio
|
||||
ruta2 = os.chdir(
|
||||
'/home/v/Documents/projectes/python/python_total/dia_06/Europa/')
|
||||
# # Leer el fichero de esa ruta
|
||||
archivo = open('Consejos.txt')
|
||||
|
||||
print(archivo.read())
|
||||
|
||||
archivo.close()
|
||||
|
||||
# Crear rutas nuevas
|
||||
os.makedirs('/home/v/Documents/projectes/python/python_total/dia_06/Africa/')
|
||||
|
||||
# Separar el path y el nombre del archivo
|
||||
|
||||
ruta3 = '/home/v/Documents/projectes/python/python_total/dia_06/Europa/Consejos.txt'
|
||||
|
||||
# # Nombre base del fichero o directorio de la ruta
|
||||
elemento = os.path.basename(ruta3)
|
||||
print(elemento)
|
||||
|
||||
# # ruta completa menos base
|
||||
elemento2 = os.path.dirname(ruta3)
|
||||
print(elemento2)
|
||||
|
||||
# # ruta completa en un tuple
|
||||
elemento3 = os.path.split(ruta3)
|
||||
print(elemento3)
|
||||
|
||||
# Eliminar carpeta
|
||||
os.rmdir('/home/v/Documents/projectes/python/python_total/dia_06/Africa/')
|
||||
|
||||
|
||||
# Se importa el objeto Path de la libreria pathlib para los siguientes ejercicios
|
||||
# Con Path buscará en cualquier SO
|
||||
carpeta = Path(
|
||||
'/home/v/Documents/projectes/python/python_total/dia_06/Europa')
|
||||
archivo2 = carpeta / 'Consejos.txt'
|
||||
|
||||
mi_archivo = open(archivo2)
|
||||
|
||||
print(mi_archivo.read())
|
||||
|
||||
mi_archivo.close()
|
||||
37
python-total/dia_06/04_pathlib.py
Normal file
37
python-total/dia_06/04_pathlib.py
Normal file
@@ -0,0 +1,37 @@
|
||||
"""
|
||||
pathlib
|
||||
|
||||
Las que no tienen paréntesis son funciones, no métodos
|
||||
|
||||
Se puede transformar a una ruta de windows importando PureWindowsPath
|
||||
|
||||
PureWindowsPath(carpeta)
|
||||
|
||||
"""
|
||||
from pathlib import Path
|
||||
|
||||
carpeta = Path(
|
||||
'/home/v/Documents/projectes/python/python_total/dia_06/prueba.txt')
|
||||
|
||||
print(carpeta.read_text())
|
||||
|
||||
# Nombre fichero
|
||||
print(carpeta.name)
|
||||
|
||||
# sufijo. Extensión
|
||||
print(carpeta.suffix)
|
||||
|
||||
# Nombre sin la terminación
|
||||
print(carpeta.stem)
|
||||
|
||||
# Ver si existe el fichero con un if
|
||||
if not carpeta.exists():
|
||||
print("Este archivo no existe")
|
||||
else:
|
||||
print("Genial, existe")
|
||||
|
||||
opcion = input("Escoger categoria: ")
|
||||
if opcion.isnumeric():
|
||||
print('Es')
|
||||
else:
|
||||
print("no")
|
||||
66
python-total/dia_06/05_path.py
Normal file
66
python-total/dia_06/05_path.py
Normal file
@@ -0,0 +1,66 @@
|
||||
"""
|
||||
path
|
||||
"""
|
||||
|
||||
# Ruta relativa
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
guia = Path("Barcelona", "Sagrada_Familia.txt")
|
||||
|
||||
print(guia)
|
||||
|
||||
print("-"*25)
|
||||
# Ruta absoluta al directorio de usuario activo
|
||||
|
||||
base = Path.home()
|
||||
# Con lo cual, si lo unimos a la ruta relativa
|
||||
# nos dará una ruta absoluta
|
||||
# (siguiento el path que le hemos dado)
|
||||
# Admite cadenas como objetos de path
|
||||
# podemos concatenar varios trozos de paths
|
||||
|
||||
mi_ruta = Path('Documents/projectes/python/python_total/dia_06')
|
||||
guia2 = Path(base, mi_ruta, "Europa", "España", Path(
|
||||
"Barcelona", "Sagrada_Familia.txt"))
|
||||
|
||||
print(base)
|
||||
print(guia2)
|
||||
|
||||
print("-"*25)
|
||||
# Utilizando la ruta absoluta anterior,
|
||||
# podemos cambiar el fichero de destino
|
||||
guia3 = guia2.with_name("La_Pedrera.txt")
|
||||
|
||||
print(guia3)
|
||||
|
||||
print("-"*25)
|
||||
# Acceder a directorios intermedios
|
||||
# con parent accedemos al path superior cada vez que lo usamos
|
||||
# Igual que los dos puntos en cd. (..)
|
||||
|
||||
print(guia2.parent.parent.parent)
|
||||
|
||||
print("-"*25)
|
||||
# Enumerar todos los archivos txt
|
||||
# # Primero hacemos la ruta
|
||||
guia4 = Path(base, mi_ruta, "Europa")
|
||||
|
||||
# # Con el método glob recorremos cada objeto de la ruta
|
||||
# # con un for
|
||||
for txt in Path(guia4).glob("*.txt"):
|
||||
print(txt)
|
||||
|
||||
print("-"*25)
|
||||
# # Recursivo o_O
|
||||
for txt in Path(guia4).glob("**/*.txt"):
|
||||
print(txt)
|
||||
|
||||
print("-"*25)
|
||||
# Para acceder a rutas relativas a partir de una base de rutas absolutas
|
||||
guia5 = Path("Europa", "España", "Barcelona", "Sagrada_Familia.txt")
|
||||
|
||||
en_europa = guia5.relative_to("Europa")
|
||||
en_espania = guia5.relative_to("Europa", "España")
|
||||
print(en_europa)
|
||||
print(en_espania)
|
||||
23
python-total/dia_06/06_limpiar_consola.py
Normal file
23
python-total/dia_06/06_limpiar_consola.py
Normal file
@@ -0,0 +1,23 @@
|
||||
"""
|
||||
Limpiar consola
|
||||
|
||||
Introducir comandos a la terminal o_O
|
||||
"""
|
||||
from os import system
|
||||
|
||||
|
||||
def limpiar_consola():
|
||||
system('tree')
|
||||
system('sleep 2')
|
||||
system('clear')
|
||||
|
||||
|
||||
nombre = input("Dime tu nombre: ")
|
||||
|
||||
print("Ahora te voy a mostrar directorios y ficheros durante 2 segundos")
|
||||
|
||||
system('sleep 2')
|
||||
|
||||
limpiar_consola()
|
||||
|
||||
print(f"¿Te quedo claro {nombre}?")
|
||||
318
python-total/dia_06/07_programa06.py
Normal file
318
python-total/dia_06/07_programa06.py
Normal file
@@ -0,0 +1,318 @@
|
||||
"""
|
||||
Programa día 6 - Recetario
|
||||
"""
|
||||
import os
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
|
||||
"""
|
||||
Variables
|
||||
"""
|
||||
ruta_base = Path('Recetas')
|
||||
limpiar = 'clear'
|
||||
sleep = 'sleep 2'
|
||||
|
||||
"""
|
||||
Funciones
|
||||
"""
|
||||
|
||||
|
||||
def clearConsole():
|
||||
# Función limpiar consola
|
||||
os.system(limpiar)
|
||||
|
||||
|
||||
def bienvenida():
|
||||
clearConsole()
|
||||
# bienvenida al usuario
|
||||
print('\n', '#' * 29, '\n # Bienvenid@ al Recetario #\n', '#' * 29)
|
||||
os.system(sleep)
|
||||
clearConsole()
|
||||
info()
|
||||
|
||||
|
||||
def info():
|
||||
|
||||
# informar la ruta de acceso al directorio donde se encuentran las recetas
|
||||
print('*' * 17, '\n* INFORMACIÓN *\n*****************\n')
|
||||
print('Las recetas están en las siguientes rutas:')
|
||||
|
||||
for ruta in Path(ruta_base).glob('*'):
|
||||
print(f'- {ruta}')
|
||||
|
||||
# informar cuántas recetas hay en total dentro de esas carpetas
|
||||
num_recetas = 0
|
||||
for ruta in Path(ruta_base).glob('**/*.txt'):
|
||||
num_recetas += 1
|
||||
|
||||
# Mostra menú de opciones
|
||||
print(f'\nEn total, existen {num_recetas} recetas.\n')
|
||||
menu_opciones()
|
||||
|
||||
|
||||
def menu_opciones():
|
||||
|
||||
comando = ''
|
||||
while comando.lower() != 's':
|
||||
print("""********************
|
||||
* MENÚ PRINCIPAL *
|
||||
********************
|
||||
|
||||
i\t\tInformación
|
||||
m\t\tMostrar recetas
|
||||
cr\t\tCrear receta
|
||||
cc\t\tCrear nueva categoria
|
||||
er\t\tEliminar receta
|
||||
ec\t\tEliminar categoria
|
||||
s\t\tsalir
|
||||
""")
|
||||
|
||||
comando = input('Selecciona una opción: ')
|
||||
clearConsole()
|
||||
|
||||
if comando == 'i':
|
||||
# Información
|
||||
info()
|
||||
elif comando == 'm':
|
||||
com = ""
|
||||
while com != 's':
|
||||
# Mostrar recetas
|
||||
cat = escoger_categoria()
|
||||
rec = escoger_receta(cat)
|
||||
mostrar_receta(rec)
|
||||
|
||||
com = input("¿Quieres salir de \"Mostrar recetas\"? (s/n) ")
|
||||
if com == 'n':
|
||||
continue
|
||||
elif com == 's':
|
||||
print('\n¡Ok! Volvemos al menú pricipal\n')
|
||||
break
|
||||
else:
|
||||
print('Disculpa, ingresa un valor válido')
|
||||
continue
|
||||
|
||||
elif comando == 'cr':
|
||||
com = ""
|
||||
while com != 's':
|
||||
# Crear receta
|
||||
cat = escoger_categoria()
|
||||
crear_receta(cat)
|
||||
|
||||
com = input("¿Quieres salir de \"Crear receta\"? (s/n) ")
|
||||
if com == 'n':
|
||||
continue
|
||||
elif com == 's':
|
||||
print('\n¡Ok! Volvemos al menú pricipal\n')
|
||||
break
|
||||
else:
|
||||
print('Disculpa, ingresa un valor válido')
|
||||
continue
|
||||
|
||||
elif comando == 'cc':
|
||||
|
||||
# Crear nueva categoria
|
||||
crear_categoria()
|
||||
|
||||
elif comando == 'er':
|
||||
com = ""
|
||||
while com != 's':
|
||||
# Eliminar receta
|
||||
cat = escoger_categoria()
|
||||
rec = escoger_receta(cat)
|
||||
eliminar_receta(rec)
|
||||
|
||||
com = input("¿Quieres salir de \"eliminar receta\"? (s/n) ")
|
||||
if com == 'n':
|
||||
continue
|
||||
elif com == 's':
|
||||
print('\n¡Ok! Volvemos al menú pricipal\n')
|
||||
break
|
||||
else:
|
||||
print('Disculpa, ingresa un valor válido')
|
||||
continue
|
||||
|
||||
elif comando == 'ec':
|
||||
com = ""
|
||||
while com != 's':
|
||||
# Eliminar categoria
|
||||
cat = escoger_categoria()
|
||||
eliminar_categoria(cat)
|
||||
|
||||
com = input("¿Quieres salir de \"eliminar categoria\"? (s/n) ")
|
||||
if com == 'n':
|
||||
continue
|
||||
elif com == 's':
|
||||
print('\n¡Ok! Volvemos al menú pricipal\n')
|
||||
break
|
||||
else:
|
||||
print('Disculpa, ingresa un valor válido')
|
||||
continue
|
||||
|
||||
elif comando == 's':
|
||||
# salir
|
||||
break
|
||||
else:
|
||||
print('Disculpa, ingresa un valor válido')
|
||||
os.system(sleep)
|
||||
clearConsole()
|
||||
info()
|
||||
|
||||
|
||||
def escoger_categoria():
|
||||
# Opción 1
|
||||
# Pregunta qué categoría elige (carnes, ensaladas, etc.),
|
||||
print('\nCategorías:')
|
||||
|
||||
num_menu = 0
|
||||
lista_categorias = []
|
||||
for ruta in Path(ruta_base).glob('*'):
|
||||
num_menu += 1
|
||||
lista_categorias.append(ruta.name)
|
||||
print(f'\t{num_menu}\t {lista_categorias[num_menu - 1]}')
|
||||
print('\n\ts\t salir de la opción \"escoger categoria\"\n')
|
||||
|
||||
opcion = ''
|
||||
while opcion != 's':
|
||||
opcion = input('Escoger categoria: ')
|
||||
|
||||
if opcion.isnumeric():
|
||||
|
||||
if int(opcion) in range(1, num_menu + 1):
|
||||
categoria = lista_categorias[int(opcion) - 1]
|
||||
return categoria
|
||||
|
||||
else:
|
||||
print(f'\nEl número {opcion} no está en el menú\n')
|
||||
continue
|
||||
elif opcion.lower() == 's':
|
||||
return False
|
||||
else:
|
||||
print('Disculpa, ingresa un valor válido')
|
||||
continue
|
||||
return False
|
||||
|
||||
|
||||
def escoger_receta(catego):
|
||||
|
||||
if catego == False:
|
||||
return False
|
||||
else:
|
||||
# una vez que el usuario elija una, preguntar qué receta quiere leer,
|
||||
print(
|
||||
f'\nEn la categoria \"{catego.upper()}\" hay las siguientes recetas: ')
|
||||
|
||||
num_menu = 0
|
||||
lista_recetas = []
|
||||
for rut in Path(ruta_base, catego).glob('*'):
|
||||
num_menu += 1
|
||||
lista_recetas.append(rut.name)
|
||||
print(f'\t{num_menu}\t {lista_recetas[num_menu - 1]}')
|
||||
print('\n\ts\t salir de la opción \"escoger receta\"\n')
|
||||
|
||||
opcion = ''
|
||||
while opcion != 's':
|
||||
opcion = input('Escoger receta: ')
|
||||
|
||||
if opcion.isnumeric():
|
||||
|
||||
if int(opcion) in range(1, num_menu + 1):
|
||||
receta = lista_recetas[int(opcion) - 1]
|
||||
ruta_escogida = Path(ruta_base, catego, receta)
|
||||
# Devuelve receta escogida
|
||||
return ruta_escogida
|
||||
|
||||
else:
|
||||
print(f'\nEl número {opcion} no está en el menú\n')
|
||||
continue
|
||||
elif opcion.lower() == 's':
|
||||
return False
|
||||
else:
|
||||
print('Disculpa, ingresa un valor válido')
|
||||
continue
|
||||
|
||||
|
||||
def mostrar_receta(ruta_escogida):
|
||||
|
||||
# mostrar contenido receta.
|
||||
if ruta_escogida == False:
|
||||
print()
|
||||
|
||||
else:
|
||||
clearConsole()
|
||||
print(
|
||||
f'\nRECETA \"{ruta_escogida.stem.upper()}\"\n{ruta_escogida.read_text()}\n')
|
||||
|
||||
|
||||
def crear_receta(categoria):
|
||||
# Opción 2
|
||||
# Elegir una categoría,
|
||||
# va a pedir que escriba el nombre y el contenido de la nueva receta que quiere crear,
|
||||
# El programa va a crear ese archivo en el lugar correcto.
|
||||
if categoria == False:
|
||||
print()
|
||||
|
||||
else:
|
||||
catego = Path(ruta_base, categoria)
|
||||
|
||||
nombre = input('¿Cómo le quieres llamar a la receta? ')
|
||||
|
||||
nueva_receta = nombre + ".txt"
|
||||
|
||||
os.chdir(catego)
|
||||
receta = open(nueva_receta.capitalize(), 'x')
|
||||
receta.close()
|
||||
|
||||
nuevo_texto = open(nueva_receta.capitalize(), 'w')
|
||||
nuevo_texto.write(input('Escribe el contenido de la receta: '))
|
||||
nuevo_texto.close()
|
||||
|
||||
os.chdir('../..')
|
||||
|
||||
print(f'\nReceta de \"{nombre}\" creada con éxito\n')
|
||||
|
||||
|
||||
def crear_categoria():
|
||||
# Opcion 3
|
||||
# Preguntar el nombre de la categoría que quiere crear
|
||||
# Generar una carpeta nueva con ese nombre.
|
||||
nueva_categ = input('¿Cómo quieres llamar la nueva categoria? ')
|
||||
catego = Path(ruta_base, nueva_categ.capitalize())
|
||||
os.makedirs(catego)
|
||||
|
||||
print(f'\nCategoria \"{nueva_categ}\" creada con éxito.\n')
|
||||
|
||||
|
||||
def eliminar_receta(ruta_escogida):
|
||||
# Opción 4
|
||||
# hará lo mismo que la opción uno,
|
||||
# pero en vez de leer la receta, la va a eliminar.
|
||||
if ruta_escogida == False:
|
||||
print()
|
||||
|
||||
else:
|
||||
print(
|
||||
f'Se ha eliminado la RECETA \"{ruta_escogida.stem.upper()}\"\n')
|
||||
os.remove(ruta_escogida)
|
||||
|
||||
|
||||
def eliminar_categoria(categoria):
|
||||
# Opción 5
|
||||
# Preguntar qué categoría quiere eliminar
|
||||
# Eliminar categoria
|
||||
if categoria == False:
|
||||
print()
|
||||
|
||||
else:
|
||||
catego = Path(ruta_base, categoria)
|
||||
print(
|
||||
f'Se ha eliminado la CATEGORIA \"{catego.stem.upper()}\"\n')
|
||||
shutil.rmtree(catego)
|
||||
|
||||
|
||||
"""
|
||||
El programa se dispara en la función bienvenida
|
||||
"""
|
||||
|
||||
bienvenida()
|
||||
|
||||
print('\n¡Ciao!\n')
|
||||
1
python-total/dia_06/Europa/Consejos.txt
Normal file
1
python-total/dia_06/Europa/Consejos.txt
Normal file
@@ -0,0 +1 @@
|
||||
Estos son los consejos
|
||||
@@ -0,0 +1 @@
|
||||
Esta es La Pedrera
|
||||
@@ -0,0 +1 @@
|
||||
Esta es la sagrada Familia
|
||||
@@ -0,0 +1 @@
|
||||
Este es el Museo del Prado
|
||||
1
python-total/dia_06/Europa/Normativas.txt
Normal file
1
python-total/dia_06/Europa/Normativas.txt
Normal file
@@ -0,0 +1 @@
|
||||
Estas son las normativas
|
||||
209
python-total/dia_06/README.md
Normal file
209
python-total/dia_06/README.md
Normal file
@@ -0,0 +1,209 @@
|
||||
# Día 6 - Programa un recetario
|
||||
|
||||
## Índice
|
||||
- [Día 6 - Programa un recetario](#día-6---programa-un-recetario)
|
||||
- [Índice](#índice)
|
||||
- [6.1. - Abrir y leer archivos](#61---abrir-y-leer-archivos)
|
||||
- [6.2. - Crear y escribir archivos](#62---crear-y-escribir-archivos)
|
||||
- [6.3. - Directorios](#63---directorios)
|
||||
- [6.4. - pathlib](#64---pathlib)
|
||||
- [6.4.1. - Navegación](#641---navegación)
|
||||
- [6.4.2. - Algunos métodos y propiedades sobre objetos Path](#642---algunos-métodos-y-propiedades-sobre-objetos-path)
|
||||
- [6.5. - Path](#65---path)
|
||||
- [6.6. - Limpiar la consola](#66---limpiar-la-consola)
|
||||
- [6.7. - Archivos + funciones](#67---archivos--funciones)
|
||||
- [6.8. - Proyecto del Día 6](#68---proyecto-del-día-6)
|
||||
- [Ficheros y documentación del día 6](#ficheros-y-documentación-del-día-6)
|
||||
|
||||
## 6.1. - Abrir y leer archivos
|
||||
|
||||
La manipulación de archivos desde Python se engloba bajo las funciones de E/S (entrada/salida) o I/O (en inglés: input/output). Comenzaremos explorando las funciones utilizadas para abrir, leer y cerrar archivos:
|
||||
|
||||
- **open(archivo, modo)**: abre un archivo, y devuelve un objeto de tipo archivo sobre el que pueden aplicarse métodos
|
||||
|
||||
- **read(bytes)**: devuelve un número especificado de bytes del archivo. De manera predeterminada (sin indicar un valor en el argumento bytes), devolverá el archivo completo (equivalente a escribir -1).
|
||||
|
||||
- **readline(bytes)**: devuelve una línea del archivo, limitada por el número indicado en el parámetro tamaño (en bytes).
|
||||
|
||||
- **readlines(bytes)**: devuelve una lista que contiene cada una de las líneas del archivo como item de dicha lista. Si el tamaño excede lo indicado en el parámetro bytes, no se devolverán líneas adicionales.
|
||||
|
||||
- **close( )**: cierra el archivo abierto, tal que no puede ser leído o escrito luego de cerrado. Es una buena práctica utilizar este método si ya no será necesario realizar acciones sobre un archivo.
|
||||
|
||||
Por lo general, un byte equivale a un caracter.
|
||||
|
||||
## 6.2. - Crear y escribir archivos
|
||||
|
||||
Para escribir en un archivo desde Python, deberemos elegir con cuidado el parámetro "modo de apertura".
|
||||
```python
|
||||
open(arhivo, modo)
|
||||
```
|
||||
|
||||
Parámetros de *modo* de apertura:
|
||||
- **"r"** - Read (Lectura) - Predeterminado. Permite leer pero no escribir, y arroja un error si el archivo no existe.
|
||||
- **"a"** - Append (Añadir) - Abre el archivo para añadir líneas a continuación de la última que ya exista en el mismo. Crea un archivo en caso de que el mismo no exista.
|
||||
- **"w"** - Write (Escritura) - Abre o crea un archivo (si no existe previamente) en modo de escritura, lo que significa que cualquier contenido previo se sobreescribirá.
|
||||
- **"x"** - Create (Creación) - Crea un archivo, y arroja un error si el mismo ya existe en el directorio.
|
||||
|
||||
El método **write( )** escribe un texto especificado en el argumento sobre el archivo.
|
||||
|
||||
**writelines(lista)** recibe el texto a ser escrito en forma de lista.
|
||||
|
||||
## 6.3. - Directorios
|
||||
|
||||
Trabajar sobre archivos que se encuentran en directorios diferentes al de nuestro código requiere del soporte del módulo OS, que contiene una serie de funciones para interactuar con el sistema operativo.
|
||||
```python
|
||||
import os
|
||||
```
|
||||
|
||||
- **os.getcwd()**: obtiene y devuelve el directorio de trabajo actual. Será el mismo en el que corre el programa si no se ha modificado.
|
||||
- **os.chdir(ruta)**: cambia el directorio de trabajo a la ruta especificada
|
||||
- **os.makedirs(ruta)**: crea una carpeta, así como todas las carpetas intermedias necesarias de acuerdo a la ruta especificada.
|
||||
- **os.path.basename(ruta)**: dada una ruta, obtiene el nombre del archivo (nombre de base)
|
||||
- **os.path.dirname(ruta)**: dada una ruta, obtiene el directorio (carpeta) que almacena el archivo
|
||||
- **os.path.split(ruta)**: devuelve una tupla que contiene dos elementos: el directorio, y el nombre de base del archivo.
|
||||
- **rmdir(ruta)**: elimina el directorio indicado en la ruta.
|
||||
|
||||
En Windows, es necesario indicar las rutas con dobles barras invertidas (\\) para que sean correctamente interpretadas por Python.
|
||||
|
||||
## 6.4. - pathlib
|
||||
|
||||
El módulo pathlib, disponible desde Python 3.4, permite crear objetos Path, generando rutas que pueden ser interpretadas por diferentes sistemas operativos y cuentan con una serie de propiedades útiles.
|
||||
```python
|
||||
from pathlib import Path
|
||||
|
||||
ruta = Path("C:/Users/Usuario/Desktop")
|
||||
```
|
||||
|
||||
A partir de una semántica sencilla, devuelve una ruta que el sistema puede comprender. Por ejemplo, en Windows, devolverá: C:\Users\Usuario\Desktop y en Mac: C:/Users/Usuario/Desktop
|
||||
|
||||
### 6.4.1. - Navegación
|
||||
```python
|
||||
ruta = Path("C:/Users/Usuario/Desktop") / "archivo.txt"
|
||||
```
|
||||
|
||||
Es posible concatenar objetos Path y strings con el delimitador "/" para construir rutas completas.
|
||||
|
||||
### 6.4.2. - Algunos métodos y propiedades sobre objetos Path
|
||||
|
||||
- **read_text( )**: lee el contenido del archivo sin necesidad de abrirlo y cerrarlo
|
||||
- **name**: devuelve el nombre y extensión del archivo
|
||||
- **suffix**: devuelve la extensión del archivo (sufijo)
|
||||
- **stem**: devuelve el nombre del archivo sin su extensión (sufijo)
|
||||
- **exists( )**: verifica si el directorio o archivo al que referencia el objeto Path existe y devuelve un booleano de acuerdo al resultado (True/False)
|
||||
|
||||
## 6.5. - Path
|
||||
|
||||
La clase Path permite representar rutas de archivos en el sistema de archivos de nuestro sistema operativo. Se destaca por su legibilidad frente a alternativas semejantes.
|
||||
|
||||
*base = Path.home()* → Devuelve un objeto Path representando el directorio base del usuario
|
||||
```python
|
||||
ruta = Path(base, "Europa", "Barcelona", "SagradaFamilia.txt")
|
||||
```
|
||||
|
||||
Se aceptan strings y otros objetos Path
|
||||
```python
|
||||
ruta2 = ruta.with_name("LaPedrera.txt")
|
||||
```
|
||||
|
||||
Devuelve un nuevo objeto Path cambiando únicamente el nombre de archivo
|
||||
|
||||
Cada invocación de la propiedad parent devuelve la ruta de jerarquía inmediata superior
|
||||
```shell
|
||||
C:\Users\...
|
||||
|_ Europa
|
||||
|_Barcelona
|
||||
|_SagradaFamilia.txt
|
||||
|_LaPedrera.txt
|
||||
```
|
||||
|
||||
```python
|
||||
continente = ruta.parent.parent
|
||||
print(continente)
|
||||
```
|
||||
|
||||
C:\Users\...\Europa
|
||||
|
||||
Devuelve el conjunto de archivos que coinciden con el "patrón"
|
||||
```python
|
||||
Path(ruta).glob("*.txt")
|
||||
Path(ruta).glob("**/*.txt")
|
||||
```
|
||||
|
||||
Búsqueda recursiva en subdirectorios
|
||||
|
||||
## 6.6. - Limpiar la consola
|
||||
|
||||
Para controlar la información mostrada al usuario en consola podemos limpiarla, eliminando los diferentes mensajes que han aparecido conforme se va ejecutando el programa.
|
||||
```python
|
||||
from os import system
|
||||
```
|
||||
|
||||
En Unix/Linux/MacOS:
|
||||
```python
|
||||
system("clear")
|
||||
```
|
||||
|
||||
En DOS/Windows:
|
||||
```python
|
||||
system("cls")
|
||||
```
|
||||
|
||||
## 6.7. - Archivos + funciones
|
||||
|
||||
**Recordatorio**: puedes crear funciones para que ejecuten código cada vez que sean invocadas, evitando repeticiones y facilitando su lectura. Esto aplica para todo Python, y desde luego también cuando manipulamos archivos.
|
||||
|
||||
¿Qué hace la función? - ¿Qué información necesita recibir?
|
||||
|
||||
```python
|
||||
def manipular_archivo(ruta, nombre_archivo):
|
||||
|
||||
# Código que convierte las entradas en salidas
|
||||
return
|
||||
```
|
||||
¿Cuál debe ser su salida?
|
||||
|
||||
## 6.8. - Proyecto del Día 6
|
||||
|
||||
Vas a crear un administrador de recetas. Básicamente esto es un programa a través del cual un usuario puede leer, crear y eliminar recetas que se encuentren en una base de datos.
|
||||
|
||||
Entonces, antes de comenzar, es necesario que crees en tu ordenador un directorio en la carpeta base de tu ordenador, con una carpeta llamada Recetas, que contiene cuatro carpetas y cada una de ellas contiene dos archivos de texto. Dentro de los archivos puedes escribir lo que quieras, puede ser la receta en sí misma o no, pero eso no es importante para este ejercicio. Lo importante es que escribas algo para poder leerlas cuando haga falta o, si prefieres, también puedes directamente descargar y descomprimir el archivo adjunto a esta elección y ubicarlo en tu directorio raíz si no tienes ganas de crearlo tú mismo.
|
||||
|
||||

|
||||
|
||||
Aquí viene la consigna: tu código le va a dar primero la bienvenida al usuario, le va a informar la ruta de acceso al directorio donde se encuentra nuestra carpeta de recetas, le va a informar cuántas recetas hay en total dentro de esa carpeta, y luego le va a pedir que elija una de estas opciones que tenemos aquí:
|
||||
|
||||
1. La opción 1 le va a preguntar qué categoría elige (carnes, ensaladas, etc.), y una vez que el usuario elija una, le va a preguntar qué receta quiere leer, y mostrar su contenido.
|
||||
2. En la opción 2 también se le va a hacer elegir una categoría, pero luego le va a pedir que escriba el nombre y el contenido de la nueva receta que quiere crear, y el programa va a crear ese archivo en el lugar correcto.
|
||||
3. La opción 3 le va a preguntar el nombre de la categoría que quiere crear y va a generar una carpeta nueva con ese nombre.
|
||||
4. La opción 4, hará todo lo mismo que la opción uno, pero en vez de leer la receta, la va a eliminar.
|
||||
5. La opción 5, le va a preguntar qué categoría quiere eliminar
|
||||
6. Finalmente, la opción 6 simplemente va a finalizar la ejecución del código.
|
||||
|
||||
Este programa tiene algunas cuestiones importantes a considerar:
|
||||
- Cada vez que el usuario realice exitosamente cualquiera de sus opciones, el programa le va a pedir que presione alguna letra para poder volver al inicio, por lo que el código se va a repetir una y otra vez, hasta que el usuario elija la opción 6. Esto implica que todo el menú debe estar dentro de un loop while que se repita una y otra vez hasta que no se cumpla la condición de que la elección del usuario sea 6
|
||||
- Sería genial que cada vez que el usuario vuelva al menú inicial, la consola limpie la pantalla para que no se acumulen las ejecuciones anteriores. Recuerda que cuentas con system para poder reiniciar la pantalla y comenzar a mostrar todo desde cero.
|
||||
- Si bien te he enseñado muchos métodos para administrar archivos, para este ejercicio vas a necesitar algunos que aún no has visto, pero que están incluidos en los objetos con los que hemos estado trabajando, por lo que en ocasiones deberás buscar entre los métodos que trae Path, por ejemplo, leer la documentación y aprender a implementarlo. Yo sé que sería mucho más fácil que yo te enseñe todo acerca de cada uno de los métodos, pero recuerda que también es importante que a medida que avanzamos vayas aprendiendo a gestionar tu propio aprendizaje. Es parte de la vida real y cotidiana del programador en el mundo en que vivimos.
|
||||
- Utiliza muchas funciones, todas las que creas necesario. Las funciones ayudan a compartir, mentalizar el código y hacerlo mucho más dinámico, ordenado, repetible y más fácil de mantener.
|
||||
- Recuerda comenzar con un diagrama de flujos o un gráfico hecho a mano que te permita visualizar con más facilidad el árbol de decisiones que necesitas ejecutar en tu código. Sin eso te vas a enredar más rápido de lo que crees y se te va a complicar bastante.
|
||||
- Y, por último, no te frustres si no logras hacerlo o completarlo. Si logras hacer una parte, un par de funciones, algunas cosas sí y otras no, está muy bien. Siempre estamos aprendiendo y parte de aprender es no saber.
|
||||
|
||||
Mis desafíos siempre te van a estar ubicando en el borde de tus capacidades, sacándote del lugar de confort para que tu cerebro tenga que desconcertarse y descubrir cómo hacer algo nuevo. Tu avanza hasta donde puedas.
|
||||
|
||||
## Ficheros y documentación del día 6
|
||||
- [01_abrir_manipular_archivos.py](01_abrir_manipular_archivos.py)
|
||||
- [02_crear_escribir_archivos.py](02_crear_escribir_archivos.py)
|
||||
- [03_directorios.py](03_directorios.py)
|
||||
- [04_pathlib.py](04_pathlib.py)
|
||||
- [05_path.py](05_path.py)
|
||||
- [06_limpiar_consola.py](06_limpiar_consola.py)
|
||||
- [07_programa06.py](07_programa06.py)
|
||||
- [Europa](Europa/)
|
||||
- [prueba.txt](prueba.txt)
|
||||
- [Recetas](Recetas/)
|
||||
- [Recetas.zip](Recetas.zip)
|
||||
|
||||
[Documentación del día](../doc_curso/06_recetario/)
|
||||
|
||||
---
|
||||
|
||||
Enlaces a todos los días: [dia 1 - creador de nombres](../dia_01/README.md) / [dia 2 - calculador de comisiones](../dia_02/README.md) / [dia 3 - analizador de texto](../dia_03/README.md) / [dia 4 - juego "adivina el número"](../dia_04/README.md) / [dia 5 - juego "El ahorcado"](../dia_05/README.md) / [dia 6 - recetario](../dia_06/README.md) / [dia 7 - cuenta bancaria](../dia_07/README.md) / [dia 8 - consola de turnos](../dia_08/README.md) / [dia 9 - buscador de números de serie](../dia_09/README.md) / [dia 10 - juego "Invasión espacial"](../dia_10/README.md) / [dia 11 - web scraping](../dia_11/README.md) / [dia 12 - gestor de restaurantes](../dia_12/README.md) / [dia 13 - asistente de voz](../dia_13/README.md) / [dia 14 - controlador de asistencia](../dia_14/README.md) / [dia 15 - machine learning](../dia_15/README.md) / [dia 16 - aplicación web de tareas pendientes](../dia_16/README.md)
|
||||
BIN
python-total/dia_06/Recetas.zip
Normal file
BIN
python-total/dia_06/Recetas.zip
Normal file
Binary file not shown.
@@ -0,0 +1 @@
|
||||
Esta es la receta del Entrecot al Malbec
|
||||
@@ -0,0 +1 @@
|
||||
Esta es la receta del Matambre a la Pizza
|
||||
@@ -0,0 +1 @@
|
||||
Esta es la receta de la Ensalada Griega
|
||||
@@ -0,0 +1 @@
|
||||
Esta es la receta de la Ensalada Mediterranea
|
||||
@@ -0,0 +1 @@
|
||||
Esta es la receta de los Canelones de Espinaca
|
||||
@@ -0,0 +1 @@
|
||||
Esta es la receta de los Ravioles de Ricotta
|
||||
@@ -0,0 +1 @@
|
||||
Esta es la receta de la Compota de Manzana
|
||||
1
python-total/dia_06/Recetas/Postres/Flan.txt
Normal file
1
python-total/dia_06/Recetas/Postres/Flan.txt
Normal file
@@ -0,0 +1 @@
|
||||
Esta es la receta de FLAN de HUEVOS
|
||||
@@ -0,0 +1 @@
|
||||
Esta es la receta de la Tarta de Frambuesa
|
||||
1
python-total/dia_06/Recetas/Postres/Trufas.txt
Normal file
1
python-total/dia_06/Recetas/Postres/Trufas.txt
Normal file
@@ -0,0 +1 @@
|
||||
Las TRUFAS están buenísimas
|
||||
1
python-total/dia_06/Recetas/Verduras/Cesped.txt
Normal file
1
python-total/dia_06/Recetas/Verduras/Cesped.txt
Normal file
@@ -0,0 +1 @@
|
||||
Esto es el contenido de CESPED. Enjoy!
|
||||
3
python-total/dia_06/prueba.txt
Normal file
3
python-total/dia_06/prueba.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
|
||||
Este texto se escribe desde python
|
||||
Holamundoaquíestoy
|
||||
Reference in New Issue
Block a user