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:
74
python-total/dia_09/01_modulo_collections.py
Normal file
74
python-total/dia_09/01_modulo_collections.py
Normal file
@@ -0,0 +1,74 @@
|
||||
"""
|
||||
Módulo collections
|
||||
|
||||
Counter - Es una especia de diccionario
|
||||
que cuentas elementos de una lista, tupla o string
|
||||
|
||||
DefaultDict - Da valores por defecto
|
||||
|
||||
NamedTuple - Tupla con nombres.
|
||||
Sirve para tener nombres además de índices
|
||||
|
||||
deque - contenedor similar a una lista con appends
|
||||
y pops rápidos en ambos extremos
|
||||
|
||||
"""
|
||||
|
||||
from collections import Counter, defaultdict, namedtuple, deque
|
||||
|
||||
|
||||
# Counter
|
||||
|
||||
numeros = [8, 6, 9, 5, 4, 5, 5, 5, 8, 7, 4, 3, 5, 4, 4]
|
||||
|
||||
print(Counter(numeros))
|
||||
print(Counter('mississippi'))
|
||||
|
||||
print()
|
||||
# Se puede utilizar módulos de Counter
|
||||
serie = Counter([1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4])
|
||||
# En orden del más común a menos
|
||||
print(serie.most_common())
|
||||
# Podemos meter Counter en una lista
|
||||
print(list(serie))
|
||||
|
||||
|
||||
print()
|
||||
# DefaultDict
|
||||
|
||||
mi_dic = defaultdict(lambda: 'nada')
|
||||
mi_dic['uno'] = 'verde'
|
||||
|
||||
# Cuando se llama a un valor que no existe
|
||||
# defaultdict lo añadirá con el valor por defecto
|
||||
print(mi_dic['cuatro'])
|
||||
|
||||
print(mi_dic)
|
||||
|
||||
|
||||
print()
|
||||
# NamedTuple
|
||||
|
||||
# Creamos una clase y con NamedTuple nombramos
|
||||
# a los elementos de la tupla
|
||||
Persona = namedtuple('Persona', ['nombre', 'altura', 'peso'])
|
||||
|
||||
# Damos valores
|
||||
ariel = Persona('Ariel', 1.76, 67)
|
||||
|
||||
# y podemos imprimir por el nombre dado
|
||||
print(ariel.altura)
|
||||
print(ariel.peso)
|
||||
|
||||
# Sin perder la manera clásica de llamarle
|
||||
# por el índice
|
||||
print(ariel[0])
|
||||
|
||||
|
||||
# deque
|
||||
lista_ciudades = deque(
|
||||
["Londres", "Berlin", "París", "Madrid", "Roma", "Moscú"])
|
||||
|
||||
lista_ciudades.appendleft('Badajoz')
|
||||
|
||||
print(lista_ciudades)
|
||||
85
python-total/dia_09/02_modulo_os_shutil.py
Normal file
85
python-total/dia_09/02_modulo_os_shutil.py
Normal file
@@ -0,0 +1,85 @@
|
||||
"""
|
||||
Módulos os y shutil
|
||||
|
||||
También método send2trash
|
||||
|
||||
"""
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import send2trash
|
||||
|
||||
# Mostrar el directorio actual
|
||||
print(os.getcwd())
|
||||
|
||||
# Vamos a abrir un archivo. Como no existe se creará.
|
||||
# Usamos la 'w' para escribir en él
|
||||
archivo = open('curso.txt', 'w')
|
||||
|
||||
archivo.write('texto de prueba')
|
||||
|
||||
archivo.close()
|
||||
|
||||
|
||||
print()
|
||||
# Mostrar archivos de la ubicación actual
|
||||
print(os.listdir())
|
||||
|
||||
|
||||
print()
|
||||
# Mover archivos con shutil
|
||||
# Movemos curso al día_08
|
||||
# Se puede con rutas relativas o absolutas
|
||||
shutil.move('curso.txt', '../dia_08')
|
||||
|
||||
# Varios métodos para eliminar ficheros
|
||||
# unlink - Elimina los ficheros de la ruta que digas
|
||||
# os.unlink(path)
|
||||
|
||||
# rmdir - Elimina directorios de la ruta que digas
|
||||
# os.rmdir(path)
|
||||
|
||||
# rmt - Eliminar todo CUIDAO Elimina todo y es irreversible
|
||||
# shutil.rmt
|
||||
|
||||
# Pongo una pausa para ver como
|
||||
# se crea y elimina el fichero
|
||||
sleep = 'sleep 3'
|
||||
os.system(sleep)
|
||||
|
||||
|
||||
# Para eliminar enviando a la papelera
|
||||
# mejor con el método send2trash
|
||||
send2trash.send2trash('../dia_08/curso.txt')
|
||||
|
||||
|
||||
# walk - Recorrer carpetas
|
||||
|
||||
# Si lo imprimimos directamente
|
||||
# nos dice que es un generator
|
||||
|
||||
print(os.walk('../..'))
|
||||
|
||||
# así que la info la proporciona tal como se le pide
|
||||
print()
|
||||
# Creamos una variable con la ruta
|
||||
ruta = '../dia_08'
|
||||
|
||||
# Hay que tener en cuenta que guarda tuplas con
|
||||
# - carpetas
|
||||
# - subcarpetas
|
||||
# - ficheros
|
||||
# Vamos a extraerlo con un iterador
|
||||
for carpeta, subcarpeta, fichero in os.walk(ruta):
|
||||
print(f'En la carpeta: {carpeta}')
|
||||
print(f'Las subcarpetas son:')
|
||||
for sub in subcarpeta:
|
||||
print(f'\t{sub}')
|
||||
|
||||
print('Los archivos son: ')
|
||||
for arch in fichero:
|
||||
# En los ficheros le vamos a poner un filtro
|
||||
# para que imprima solo lo que nos interesa
|
||||
if arch.startswith('0'):
|
||||
print(f'\t{arch}')
|
||||
print()
|
||||
32
python-total/dia_09/03_modulo_datetime_1.py
Normal file
32
python-total/dia_09/03_modulo_datetime_1.py
Normal file
@@ -0,0 +1,32 @@
|
||||
"""
|
||||
Módulo datime
|
||||
Primera parte
|
||||
|
||||
- Almacenar hora y fecha en variables
|
||||
- Cálculos de tiempo
|
||||
- Mostrar en diferentes formatos
|
||||
|
||||
"""
|
||||
import datetime
|
||||
|
||||
# Guardar en una variable la hora
|
||||
mi_hora = datetime.time(17, 35, 50, 1300)
|
||||
# Imprimir tipo de formato
|
||||
print(f'Formato de datetime: {type(mi_hora)}')
|
||||
# Imprimir la hora establecida
|
||||
print(mi_hora)
|
||||
# Imprimir un elemento de la hora
|
||||
print(mi_hora.minute)
|
||||
|
||||
|
||||
print()
|
||||
# Guardar en variable la fecha
|
||||
mi_fecha = datetime.date(2025, 10, 23)
|
||||
# Mostrar fecha
|
||||
print(mi_fecha)
|
||||
# Mostrar un elemento de fecha
|
||||
print(mi_fecha.year)
|
||||
# Cambiar el formato a la fecha
|
||||
print(mi_fecha.ctime())
|
||||
# Mostrar el día de hoy
|
||||
print(mi_fecha.today())
|
||||
59
python-total/dia_09/03_modulo_datetime_2.py
Normal file
59
python-total/dia_09/03_modulo_datetime_2.py
Normal file
@@ -0,0 +1,59 @@
|
||||
"""
|
||||
Módulo datime
|
||||
Segunda parte
|
||||
|
||||
"""
|
||||
from datetime import datetime, timedelta, date
|
||||
|
||||
# Para los siguientes ejercicios
|
||||
# se debe importar un objeto
|
||||
# llamado datetime que se encuentra
|
||||
# en el módulo datetime, el cuál crea conflicto
|
||||
# con el anterior ejercicio import datetime
|
||||
|
||||
mi_dia = datetime(2025, 5, 15, 22, 10, 15, 2500)
|
||||
|
||||
print(mi_dia)
|
||||
|
||||
# Se puede reemplazar elementos
|
||||
mi_dia = mi_dia.replace(month=11)
|
||||
|
||||
print(mi_dia)
|
||||
|
||||
|
||||
print()
|
||||
# Se pueden calcular tiempos
|
||||
# se debe importar date
|
||||
|
||||
# Variables de nacimiento y de hoy
|
||||
nacimiento = date(1983, 10, 30)
|
||||
hoy = date.today()
|
||||
# Se resta
|
||||
tiempo_vida = hoy - nacimiento
|
||||
# Se muestra en dias
|
||||
print(tiempo_vida.days)
|
||||
|
||||
# También podemos calcular horas
|
||||
|
||||
despertar = datetime(2023, 3, 30, 6, 30)
|
||||
dormir = datetime(2023, 3, 30, 23, 35)
|
||||
|
||||
tiempo_despierto = dormir - despertar
|
||||
|
||||
# Podemos verlo en segundos
|
||||
print(tiempo_despierto.seconds)
|
||||
|
||||
print()
|
||||
# Minutos ahora
|
||||
|
||||
hoys = datetime(2100, 10, 20, 10, 20).today().time().minute
|
||||
|
||||
print(hoys)
|
||||
|
||||
|
||||
# Calcular el tiempo
|
||||
# Extra. Importo timedelta para probarlo
|
||||
|
||||
hora_actual = datetime.now() + timedelta(hours=5, minutes=50)
|
||||
|
||||
print('{:%H:%M}'.format(hora_actual))
|
||||
108
python-total/dia_09/04_modulo_medir_tiempo.py
Normal file
108
python-total/dia_09/04_modulo_medir_tiempo.py
Normal file
@@ -0,0 +1,108 @@
|
||||
"""
|
||||
Módulo para medir tiempo
|
||||
|
||||
time - puedes realizar marcas de tiempo en el código
|
||||
para poder hacer comparaciones
|
||||
|
||||
timeit - Más especifico, muestra cuanto tarda en ejecutarse un código.
|
||||
|
||||
"""
|
||||
|
||||
import time
|
||||
import timeit
|
||||
|
||||
# Dos funciones con formas distintas
|
||||
# de hacer código
|
||||
# para el mismo resultado:
|
||||
|
||||
|
||||
def prueba_for(numero):
|
||||
""" Prueba de iteración for """
|
||||
lista = []
|
||||
for num in range(1, numero+1):
|
||||
lista.append(num)
|
||||
return lista
|
||||
|
||||
|
||||
def prueba_while(numero):
|
||||
""" Prueba de iteración while """
|
||||
lista = []
|
||||
contador = 1
|
||||
while contador <= numero:
|
||||
lista.append(contador)
|
||||
contador += 1
|
||||
return lista
|
||||
|
||||
|
||||
# Vamos a identificar cual de las dos funciones
|
||||
# resuelve de manera más eficiente
|
||||
# con el módulo time, haciendo
|
||||
# marcas de tiempo
|
||||
inicio = time.time()
|
||||
prueba_for(1000000)
|
||||
final = time.time()
|
||||
print(f' La función for tardó: {final - inicio}')
|
||||
|
||||
inicio = time.time()
|
||||
prueba_while(1000000)
|
||||
final = time.time()
|
||||
print(f' La función while tardó: {final - inicio}')
|
||||
|
||||
|
||||
print()
|
||||
# timeit puede identificar
|
||||
# cuanto tarda con más precisión
|
||||
"""
|
||||
Sintaxis:
|
||||
|
||||
duracion = timeit.timeit(declaracion, setup, number = numero)
|
||||
|
||||
declaracion: recibe el código que cuya duración
|
||||
de ejecución queremos medir.
|
||||
→ es la invocación mi función
|
||||
|
||||
setup: recibe las instrucciones que el parámetro
|
||||
declaracion requiere para funcionar.
|
||||
→ es la definición (def...) de mi función
|
||||
|
||||
number: cantidad de veces que se evaluará el
|
||||
código para obtener su tiempo de ejecución mínimo.
|
||||
→ pueden ser varios miles o cientos de veces (dependiendo de la complejidad)
|
||||
"""
|
||||
|
||||
declaracion = '''
|
||||
prueba_for(10)
|
||||
'''
|
||||
|
||||
mi_setup = '''
|
||||
def prueba_for(numero):
|
||||
""" Prueba de iteración for """
|
||||
lista = []
|
||||
for num in range(1, numero+1):
|
||||
lista.append(num)
|
||||
return lista
|
||||
'''
|
||||
|
||||
duracion_for = timeit.timeit(declaracion, mi_setup, number=10000000)
|
||||
|
||||
print(f' La función for tardó: {duracion_for}')
|
||||
|
||||
|
||||
declaracion2 = '''
|
||||
prueba_while(10)
|
||||
'''
|
||||
|
||||
mi_setup2 = '''
|
||||
def prueba_while(numero):
|
||||
""" Prueba de iteración while """
|
||||
lista = []
|
||||
contador = 1
|
||||
while contador <= numero:
|
||||
lista.append(contador)
|
||||
contador += 1
|
||||
return lista
|
||||
'''
|
||||
|
||||
duracion_while = timeit.timeit(declaracion2, mi_setup2, number=10000000)
|
||||
|
||||
print(f' La función while tardó: {duracion_while}')
|
||||
51
python-total/dia_09/05_modulo_math.py
Normal file
51
python-total/dia_09/05_modulo_math.py
Normal file
@@ -0,0 +1,51 @@
|
||||
"""
|
||||
Módulo math
|
||||
|
||||
Contiene el kit completo para trabajar con números:
|
||||
Matemática clásica y avanzada.
|
||||
|
||||
También existe el módulo numpy
|
||||
que es más avanzado aún. https://numpy.org/
|
||||
|
||||
"""
|
||||
|
||||
import math
|
||||
|
||||
# EJEMPLOS
|
||||
|
||||
# Redondeo hacia abajo, hacia el piso
|
||||
resultado = math.floor(90.99999)
|
||||
print(resultado)
|
||||
|
||||
# Redondeo hacia arriba, hacia el techo
|
||||
resultado = math.ceil(90.11111)
|
||||
print(resultado)
|
||||
|
||||
# Mostrar pi
|
||||
resultado = math.pi
|
||||
print(resultado)
|
||||
|
||||
# Calcular un log, en función de un número
|
||||
# y una base, saber por cuanto deberíamos exponer
|
||||
# la base para llegar al número
|
||||
resultado = math.log(625, 5)
|
||||
print(resultado)
|
||||
# Calcular en base 10
|
||||
resultado = math.log10(25)
|
||||
print(resultado)
|
||||
|
||||
# Calcular la tangente
|
||||
resultado = math.tan(2565)
|
||||
print(resultado)
|
||||
|
||||
# Calcular la coseno
|
||||
resultado = math.cos(2565)
|
||||
print(resultado)
|
||||
|
||||
# Calcular la raíz cuadrada de pi
|
||||
resultado = math.sqrt(math.pi)
|
||||
print(resultado)
|
||||
|
||||
# Calcular factorial
|
||||
resultado = math.factorial(7)
|
||||
print(resultado)
|
||||
222
python-total/dia_09/06_modulo_re.py
Normal file
222
python-total/dia_09/06_modulo_re.py
Normal file
@@ -0,0 +1,222 @@
|
||||
"""
|
||||
Módulo re
|
||||
|
||||
Expresiones regulares
|
||||
|
||||
Operadores especiales:
|
||||
[ ] un set de caracteres
|
||||
. un carácter cualquiera
|
||||
^ inicia con
|
||||
$ finaliza con
|
||||
| operador lógico "O"
|
||||
|
||||
Cuantificadores:
|
||||
* cero o más ocurrencias: 0 - n
|
||||
+ una o más ocurrencias: 1 - n
|
||||
? cero o una ocurrencia: 0 - 1
|
||||
{ } un número especificado de ocurrencias
|
||||
{n} se repite n veces
|
||||
{n,m} se repite de n a m veces
|
||||
{n, } se repite de n veces hacia arriba
|
||||
|
||||
Carácteres especiales:
|
||||
\d dígito numérico
|
||||
\D NO numérico
|
||||
\w caracter alfanumérico
|
||||
\W NO alfanumérico
|
||||
\s espacio en blanco
|
||||
\S NO espacio en blanco
|
||||
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
# Buscar este patrón: ### - #### - ####
|
||||
# De diferentes formas:
|
||||
patron1 = r'\d\d\d-\d\d\d-\d\d\d\d'
|
||||
patron2 = r'\d{3}-\d{3}-\d{4}'
|
||||
# Si no existe dirá: Node
|
||||
verificacion01 = re.search(patron1, '234-233-l23l')
|
||||
# Si existe dirá que tiene match:
|
||||
# <re.Match object; span=(0, 12), match='234-233-1231'>
|
||||
verificacion02 = re.search(patron1, '234-233-1231')
|
||||
print(
|
||||
f'La verificación 1 es {verificacion01}\nLa verificación 2 es {verificacion02}')
|
||||
|
||||
|
||||
print()
|
||||
|
||||
# Usando un texto
|
||||
|
||||
texto = 'Si necesitas ayuda llama al (658)-598-9977 las 24 horas al servicio de ayuda online'
|
||||
|
||||
palabra = 'ayuda' in texto
|
||||
|
||||
print(f'Es {palabra} que la palabra ayuda está en el texto')
|
||||
# Con expresión regular
|
||||
patron03 = 'ayuda'
|
||||
|
||||
# Busqueda es un objeto regular expresión
|
||||
# en concreto search
|
||||
busqueda01 = re.search(patron03, texto)
|
||||
# con lo cual, tiene módulos
|
||||
# span indica la ubicación
|
||||
print(busqueda01.span())
|
||||
# start indica la ubicación del inicio
|
||||
print(busqueda01.start())
|
||||
# end indica la ubicación del final
|
||||
print(busqueda01.end())
|
||||
|
||||
|
||||
print()
|
||||
# Objeto findall
|
||||
# Mete en una lista cada vez que aparece el patron
|
||||
busqueda02 = re.findall(patron03, texto)
|
||||
print(busqueda02)
|
||||
# Podemos ver el número de veces con len
|
||||
print(len(busqueda02))
|
||||
|
||||
|
||||
print()
|
||||
# Podemos iterar la búsqueda
|
||||
# con el módulo finiter para
|
||||
# tener información de cada resultado encontrado
|
||||
for hallazgo in re.finditer(patron03, texto):
|
||||
print(hallazgo.span())
|
||||
|
||||
|
||||
print()
|
||||
# Vamos a buscar el número de teléfono del texto
|
||||
# se puede escapar los paréntesis para que los búsque
|
||||
# y agrupar con parétesis
|
||||
patron04 = r'\((\d{3})\)-(\d{3})-(\d{4})'
|
||||
|
||||
busqueda03 = re.search(patron04, texto)
|
||||
# Podemos mostrar el resultado mostrando los grupos
|
||||
print(busqueda03.group())
|
||||
# y como además los hemos encerrado en paréntesis
|
||||
# podemos llamar a cada uno de los grupos
|
||||
print(busqueda03.group(2))
|
||||
|
||||
# Podemos controlar la entrada del usuario
|
||||
# ⚠️ Cuidao: Este método no sirve para verificar contraseñas
|
||||
# por ejemplo:
|
||||
#
|
||||
print("""
|
||||
Introduce una clave con las condiciones:
|
||||
- Empezar con una letra
|
||||
- En total 8 carácteres
|
||||
""")
|
||||
|
||||
clave = input('> ')
|
||||
patron05 = r'\D{1}\w{7}'
|
||||
chequear = re.search(patron05, clave)
|
||||
print(chequear)
|
||||
|
||||
|
||||
print()
|
||||
# Operadores especiales
|
||||
# or
|
||||
buscarunouotro = re.search(r'online|offline', texto)
|
||||
print(buscarunouotro.group())
|
||||
|
||||
|
||||
print()
|
||||
# Comodin en un espacio con punto
|
||||
comodin01 = re.search(r'...vicio', texto)
|
||||
print(comodin01.group())
|
||||
|
||||
|
||||
print()
|
||||
# Comodin inicio con ^
|
||||
# Por ejemplo, que el primer caracter no sea un dígito
|
||||
comodin02 = re.search(r'^\D', texto)
|
||||
print(comodin02.group())
|
||||
|
||||
|
||||
print()
|
||||
# Comodin final con $
|
||||
# Por ejemplo, que el último caracter sea un dígito
|
||||
comodin03 = re.search(r'\d$', texto)
|
||||
print(comodin03)
|
||||
|
||||
|
||||
print()
|
||||
# Comodin de un set de caracteres con [^]
|
||||
# Por ejemplo, todos los que incluyan un carácter vacío
|
||||
comodin04 = re.findall(r'[^\S]', texto)
|
||||
print(f'El texto contiene {len(comodin04)} espacios en blanco')
|
||||
|
||||
|
||||
print()
|
||||
# Comodin de un set de caracteres con [^+]
|
||||
# Ahora, además, va a agrupar los que no son
|
||||
# espacios vacíos en strings dentro de la lista
|
||||
# Seleciona cada inicio con caracter hasta que
|
||||
# encuentra otro espacio en blanco.
|
||||
comodin05 = re.findall(r'[^\s]+', texto)
|
||||
print(comodin05)
|
||||
|
||||
# Con esto y join podemos unir de nuevo el texto pero
|
||||
# sustituyendo con guiones, por ejemplo.
|
||||
# Puede servir para corregir nombres de ficheros o directorios.
|
||||
print('-'.join(comodin05))
|
||||
|
||||
|
||||
# EJERCICIOS
|
||||
|
||||
|
||||
print()
|
||||
# Verificar si es un mail
|
||||
|
||||
|
||||
def verificar_email(email):
|
||||
""" Verificar sin es un mail .com """
|
||||
patron = r'[\w]*@[\w]*\.com[\w]*'
|
||||
verificacion = re.search(patron, email)
|
||||
|
||||
if verificacion:
|
||||
print("Ok. Es un mail")
|
||||
else:
|
||||
print("La dirección de email es incorrecta")
|
||||
|
||||
|
||||
verificar_email("email@mail.com")
|
||||
|
||||
print()
|
||||
# Verificar saludo
|
||||
|
||||
|
||||
def verificar_saludo(frase):
|
||||
""" Verificar si saluda con Hola """
|
||||
patron = r'^Hola'
|
||||
verificacion = re.search(patron, frase)
|
||||
|
||||
if verificacion:
|
||||
print("Ok. Este mensaje tiene saludo al inicio")
|
||||
else:
|
||||
print("No has saludado")
|
||||
|
||||
|
||||
verificar_saludo("Hola, que tal?")
|
||||
|
||||
|
||||
print()
|
||||
# Verificar Código postal.
|
||||
# Dos caracteres alfanuméricos
|
||||
# y cuatro numéricos a continuación
|
||||
# (ejemplo: XX1234)
|
||||
|
||||
|
||||
def verificar_cp(cp):
|
||||
""" Verificar si saluda con Hola """
|
||||
patron = r'^\w{2}\d{4}$'
|
||||
verificacion = re.search(patron, cp)
|
||||
|
||||
if verificacion:
|
||||
print("Ok. Es un código postal")
|
||||
else:
|
||||
print("El código postal ingresado no es correcto")
|
||||
|
||||
|
||||
verificar_cp("XX1234")
|
||||
15
python-total/dia_09/07_modulo_comprimir_shutil.py
Normal file
15
python-total/dia_09/07_modulo_comprimir_shutil.py
Normal file
@@ -0,0 +1,15 @@
|
||||
"""
|
||||
Módulos comprimir y descomprimir
|
||||
|
||||
shutil - Nos permite comprimir
|
||||
todos los archivos y directorios de una carpeta
|
||||
|
||||
"""
|
||||
|
||||
import shutil
|
||||
|
||||
carpeta_origen = 'carpeta_superior'
|
||||
|
||||
archivo_destino = 'todo_comprimido'
|
||||
|
||||
shutil.make_archive(archivo_destino, 'zip', carpeta_origen)
|
||||
15
python-total/dia_09/07_modulo_comprimir_zipfile.py
Normal file
15
python-total/dia_09/07_modulo_comprimir_zipfile.py
Normal file
@@ -0,0 +1,15 @@
|
||||
"""
|
||||
Módulos comprimir y descomprimir
|
||||
|
||||
zipfile
|
||||
|
||||
"""
|
||||
|
||||
import zipfile
|
||||
|
||||
mi_zip = zipfile.ZipFile('archivo_comprimido.zip', 'w')
|
||||
|
||||
mi_zip.write('mi_texto_A.txt')
|
||||
mi_zip.write('mi_texto_B.txt')
|
||||
|
||||
mi_zip.close()
|
||||
10
python-total/dia_09/07_modulo_descomprimir_shutil.py
Normal file
10
python-total/dia_09/07_modulo_descomprimir_shutil.py
Normal file
@@ -0,0 +1,10 @@
|
||||
"""
|
||||
Módulos comprimir y descomprimir
|
||||
|
||||
shutil
|
||||
|
||||
"""
|
||||
|
||||
import shutil
|
||||
|
||||
shutil.unpack_archive('todo_comprimido.zip', 'extraccion_terminada', 'zip')
|
||||
13
python-total/dia_09/07_modulo_descomprimir_zipfile.py
Normal file
13
python-total/dia_09/07_modulo_descomprimir_zipfile.py
Normal file
@@ -0,0 +1,13 @@
|
||||
"""
|
||||
Módulos comprimir y descomprimir
|
||||
|
||||
zipfile
|
||||
|
||||
"""
|
||||
|
||||
import zipfile
|
||||
|
||||
|
||||
zip_abierto = zipfile.ZipFile('archivo_comprimido.zip', 'r')
|
||||
|
||||
zip_abierto.extractall()
|
||||
8
python-total/dia_09/08_Descomprimir_proyecto.py
Normal file
8
python-total/dia_09/08_Descomprimir_proyecto.py
Normal file
@@ -0,0 +1,8 @@
|
||||
"""
|
||||
Descomprimir proyecto día 9
|
||||
|
||||
"""
|
||||
|
||||
import shutil
|
||||
|
||||
shutil.unpack_archive('Proyecto+Dia+9.zip', '09_Programa09', 'zip')
|
||||
46
python-total/dia_09/09_Programa09/Instrucciones.txt
Normal file
46
python-total/dia_09/09_Programa09/Instrucciones.txt
Normal file
@@ -0,0 +1,46 @@
|
||||
¡Qué bueno que lograste abrirme!
|
||||
|
||||
Junto a esta nota se ha descomprimido 1 carpeta, y está repletas de subcarpetas y de archivos .txt.
|
||||
|
||||
No te preocupes por revisarlos, solo tienen texto aleatorio... excepto algunos. ¯\_(ツ)_/¯
|
||||
|
||||
Tu trabajo es crear un Buscador de Números de Serie. ¿Qué es eso? Es un programa que se encargue de buscar números de serie que cumplan un determinado formato, dentro de un arbol de carpetas.
|
||||
|
||||
Tu programa va a recorrer todos los archivos y subcarpetas de un directorio raiz (en este caso, la carpeta que acabas de descomprimir), y va a buscar cualquier string que coincida con un patrón de número de serie. Sabemos que no puede haber más de un número de serie por archivo.
|
||||
|
||||
Para lograrlo vas a usar el módulo os para abrir e iterear por el directorio, y las expresiones regulares para encontrar el formato de número de serie correcto.
|
||||
|
||||
A los fines de este ejercicio, estas son las condiciones de formato que deben cumplir los hallazgos:
|
||||
- [N] + [tres carateres de texto] + [-] + [5 números]
|
||||
|
||||
Por ejemplo: Nryu-12365
|
||||
|
||||
La presentación en pantalla de los hallazgos debe ser un listado en formato de tabla, que respete el siguiente formato de ejemplo:
|
||||
|
||||
----------------------------------------------------
|
||||
Fecha de búsqueda: [fecha de hoy]
|
||||
|
||||
ARCHIVO NRO. SERIE
|
||||
------- ----------
|
||||
texto1.txt Nter-15496
|
||||
texto25.txt Ngba-85235
|
||||
|
||||
Números encontrados: 2
|
||||
Duración de la búsqueda: 1 segundos
|
||||
----------------------------------------------------
|
||||
|
||||
IMPORTANTE
|
||||
|
||||
* La 'Duración de búsqueda' debe estar redondeada hacia arriba
|
||||
|
||||
* No olvides que la mejor forma de recorrer un arbol de carpetas, probablemente sea con el método walk() de os.
|
||||
|
||||
* Observa que la fecha de búsqueda debe ser la fecha del día en que ejecutes el código, por lo que necesitas echar mano del módulo datetime.
|
||||
|
||||
* Animate a encontrar una manera de mostrar la fecha de hoy con el formato dd/mm/aa.
|
||||
|
||||
* Para informar la duración de la búsqueda al final de tu presentación, vas a necesitar del módulo time.
|
||||
|
||||
* Recuerda que para poder imprimir todo en formato de tabla puedes usar los caracteres especiales \t para tabular.
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
Curabitur eget bibendum dolor. Praesent eu metus ac neque convallis pharetra. Phasellus in enim lobortis, volutpat orci sit amet, scelerisque tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin ultricies in nulla et facilisis. Pellentesque justo ipsum, pellentesque sed convallis et, feugiat quis nulla. Aliquam maximus elementum nisl non rutrum. Suspendisse id malesuada ante. Phasellus commodo ex quis orci iaculis finibus.
|
||||
@@ -0,0 +1 @@
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent in tellus porta, vehicula nisl vel, ultrices orci. Mauris egestas, lectus eget consectetur dictum, dui lectus suscipit nulla, vitae tristique elit orci dignissim elit. Sed fermentum elementum odio, sit amet rhoncus nibh pellentesque eu. Proin sit amet porttitor lorem. Cras urna orci, molestie a semper quis, commodo non augue. Vestibulum blandit pellentesque lectus, sit amet dignissim orci finibus quis. In sem metus, pellentesque eget ultrices ac, tempor eleifend ligula.
|
||||
@@ -0,0 +1 @@
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent in tellus porta, vehicula nisl vel, ultrices orci. Mauris egestas, lectus eget consectetur dictum, dui lectus suscipit nulla, vitae tristique elit orci dignissim elit. Sed fermentum elementum Nhjn-54885 odio, sit amet rhoncus nibh pellentesque eu. Proin sit amet porttitor lorem. Cras urna orci, molestie a semper quis, commodo non augue. Vestibulum blandit pellentesque lectus, sit amet dignissim orci finibus quis. In sem metus, pellentesque eget ultrices ac, tempor eleifend ligula.
|
||||
@@ -0,0 +1 @@
|
||||
Etiam porttitor ligula fermentum mauris laoreet, a ultrices nibh scelerisque. Quisque erat mauris, rutrum quis pretium vitae, sollicitudin nec nisl. Etiam pretium est a commodo elementum. In lectus elit, semper eget aliquet nec, eleifend ut velit. Phasellus feugiat neque malesuada purus congue, in tincidunt dolor finibus. Proin eu bibendum velit. Aliquam tincidunt euismod justo, vel elementum tellus semper eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean iaculis metus mauris, ut porttitor dolor volutpat a. Proin porttitor enim at tincidunt sollicitudin. Maecenas auctor pretium tempus. Nunc sit amet mi nunc.
|
||||
@@ -0,0 +1 @@
|
||||
Etiam porttitor ligula fermentum mauris laoreet, a ultrices nibh scelerisque. Quisque erat mauris, rutrum quis pretium vitae, sollicitudin nec nisl. Etiam pretium est a commodo elementum. In lectus elit, semper eget aliquet nec, eleifend ut velit. Phasellus feugiat neque malesuada purus congue, in tincidunt dolor finibus. Proin eu bibendum velit. Aliquam tincidunt euismod justo, vel elementum tellus semper eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean iaculis metus mauris, ut porttitor dolor volutpat a. Proin porttitor enim at tincidunt sollicitudin. Maecenas auctor pretium tempus. Nunc sit amet mi nunc.
|
||||
@@ -0,0 +1 @@
|
||||
Etiam porttitor ligula fermentum mauris laoreet, a ultrices nibh scelerisque. Quisque erat mauris, rutrum quis pretium vitae, sollicitudin nec nisl. Etiam pretium est a commodo elementum. In lectus elit, semper eget aliquet nec, eleifend ut velit. Phasellus feugiat neque malesuada purus congue, in tincidunt dolor finibus. Proin eu bibendum velit. Aliquam tincidunt euismod justo, vel elementum tellus semper eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean iaculis metus mauris, ut porttitor dolor volutpat a. Proin porttitor enim at tincidunt sollicitudin. Maecenas auctor pretium tempus. Nunc sit amet mi nunc.
|
||||
@@ -0,0 +1 @@
|
||||
Etiam porttitor ligula fermentum mauris laoreet, a ultrices nibh scelerisque. Quisque erat mauris, rutrum quis pretium vitae, sollicitudin nec nisl. Etiam pretium est a commodo elementum. In lectus elit, semper eget aliquet nec, eleifend ut velit. Phasellus feugiat neque malesuada purus congue, in tincidunt dolor finibus. Proin eu bibendum velit. Aliquam tincidunt euismod justo, vel elementum tellus semper eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean iaculis metus mauris, ut porttitor dolor volutpat a. Proin porttitor enim at tincidunt sollicitudin. Maecenas auctor pretium tempus. Nunc sit amet mi nunc.
|
||||
@@ -0,0 +1 @@
|
||||
Etiam porttitor ligula fermentum mauris laoreet, a ultrices nibh scelerisque. Quisque erat mauris, rutrum quis pretium vitae, sollicitudin nec nisl. Etiam pretium est a commodo elementum. In lectus elit, semper eget aliquet nec, eleifend ut velit. Phasellus feugiat neque malesuada purus congue, in tincidunt dolor finibus. Proin eu bibendum velit. Aliquam tincidunt euismod justo, vel elementum tellus semper eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean iaculis metus mauris, ut porttitor dolor volutpat a. Proin porttitor enim at tincidunt sollicitudin. Maecenas auctor pretium tempus. Nunc sit amet mi nunc.
|
||||
@@ -0,0 +1 @@
|
||||
Fusce at ornare sapien. Curabitur vestibulum nibh in neque tincidunt, non interdum ante semper. Vivamus eget scelerisque eros. Vestibulum egestas elementum congue. Ut hendrerit ultrices nunc, quis elementum arcu. Fusce ullamcorper quam accumsan, commodo augue ac, viverra ipsum. Nlkj-41523 Pellentesque venenatis vehicula felis id placerat. Praesent mollis lobortis lorem, vel efficitur risus mollis eget. Quisque molestie sapien quis enim ultrices mollis nec eu lacus.
|
||||
@@ -0,0 +1 @@
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent in tellus porta, vehicula nisl vel, ultrices orci. Mauris egestas, lectus eget consectetur dictum, dui lectus suscipit nulla, vitae tristique elit orci dignissim elit. Sed fermentum elementum odio, sit amet rhoncus nibh pellentesque eu. Proin sit amet porttitor lorem. Cras urna orci, molestie a semper quis, commodo non augue. Vestibulum blandit pellentesque lectus, sit amet dignissim orci finibus quis. In sem metus, pellentesque eget ultrices ac, tempor eleifend ligula.
|
||||
@@ -0,0 +1 @@
|
||||
Etiam porttitor ligula fermentum mauris laoreet, a ultrices nibh scelerisque. Quisque erat mauris, rutrum quis pretium vitae, sollicitudin nec nisl. Etiam pretium est a commodo elementum. In lectus elit, semper eget aliquet nec, eleifend ut velit. Phasellus feugiat neque malesuada purus congue, in tincidunt dolor finibus. Nann-74705 Proin eu bibendum velit. Aliquam tincidunt euismod justo, vel elementum tellus semper eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean iaculis metus mauris, ut porttitor dolor volutpat a. Proin porttitor enim at tincidunt sollicitudin. Maecenas auctor pretium tempus. Nunc sit amet mi nunc.
|
||||
@@ -0,0 +1 @@
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent in tellus porta, vehicula nisl vel, ultrices orci. Mauris egestas, lectus eget consectetur dictum, dui lectus suscipit nulla, vitae tristique elit orci dignissim elit. Sed fermentum elementum odio, sit amet rhoncus nibh pellentesque eu. Proin sit amet porttitor lorem. Cras urna orci, molestie a semper quis, commodo non augue. Vestibulum blandit pellentesque lectus, sit amet dignissim orci finibus quis. In sem metus, pellentesque eget ultrices ac, tempor eleifend ligula.
|
||||
@@ -0,0 +1 @@
|
||||
Curabitur eget bibendum dolor. Praesent eu metus ac neque convallis pharetra. Phasellus in enim lobortis, volutpat orci sit amet, scelerisque tellus. Nqqs-82506 Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin ultricies in nulla et facilisis. Pellentesque justo ipsum, pellentesque sed convallis et, feugiat quis nulla. Aliquam maximus elementum nisl non rutrum. Suspendisse id malesuada ante. Phasellus commodo ex quis orci iaculis finibus.
|
||||
@@ -0,0 +1 @@
|
||||
Etiam porttitor ligula fermentum mauris laoreet, a ultrices nibh scelerisque. Quisque erat mauris, rutrum quis pretium vitae, sollicitudin nec nisl. Etiam pretium est a commodo elementum. In lectus elit, semper eget aliquet nec, eleifend ut velit. Phasellus feugiat neque malesuada purus congue, in tincidunt dolor finibus. Proin eu bibendum velit. Aliquam tincidunt euismod justo, vel elementum tellus semper eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean iaculis metus mauris, ut porttitor dolor volutpat a. Proin porttitor enim at tincidunt sollicitudin. Maecenas auctor pretium tempus. Nunc sit amet mi nunc.
|
||||
@@ -0,0 +1 @@
|
||||
Curabitur eget bibendum dolor. Praesent eu metus ac neque convallis pharetra. Phasellus in enim lobortis, volutpat orci sit amet, scelerisque tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin ultricies in nulla et facilisis. Pellentesque justo ipsum, pellentesque sed convallis et, feugiat quis nulla. Aliquam maximus elementum nisl non rutrum. Suspendisse id malesuada ante. Phasellus commodo ex quis orci iaculis finibus.
|
||||
@@ -0,0 +1 @@
|
||||
Fusce at ornare sapien. Curabitur vestibulum nibh in neque tincidunt, non interdum ante semper. Vivamus eget scelerisque eros. Vestibulum egestas elementum congue. Ut hendrerit ultrices nunc, quis elementum arcu. Nopp-10052 Fusce ullamcorper quam accumsan, commodo augue ac, viverra ipsum. Pellentesque venenatis vehicula felis id placerat. Praesent mollis lobortis lorem, vel efficitur risus mollis eget. Quisque molestie sapien quis enim ultrices mollis nec eu lacus.
|
||||
@@ -0,0 +1 @@
|
||||
Fusce at ornare sapien. Curabitur vestibulum nibh in neque tincidunt, non interdum ante semper. Vivamus eget scelerisque eros. Vestibulum egestas elementum congue. Ut hendrerit ultrices nunc, quis elementum arcu. Nmrn-20155 Fusce ullamcorper quam accumsan, commodo augue ac, viverra ipsum. Pellentesque venenatis vehicula felis id placerat. Praesent mollis lobortis lorem, vel efficitur risus mollis eget. Quisque molestie sapien quis enim ultrices mollis nec eu lacus.
|
||||
@@ -0,0 +1 @@
|
||||
Etiam porttitor ligula fermentum mauris laoreet, a ultrices nibh scelerisque. Quisque erat mauris, rutrum quis pretium vitae, sollicitudin nec nisl. Etiam pretium est a commodo elementum. In lectus elit, semper eget aliquet nec, eleifend ut velit. Phasellus feugiat neque malesuada purus congue, in tincidunt dolor finibus. Proin eu bibendum velit. Aliquam tincidunt euismod justo, vel elementum tellus semper eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean iaculis metus mauris, ut porttitor dolor volutpat a. Proin porttitor enim at tincidunt sollicitudin. Maecenas auctor pretium tempus. Nunc sit amet mi nunc.
|
||||
@@ -0,0 +1 @@
|
||||
Curabitur eget bibendum dolor. Praesent eu metus ac neque convallis pharetra. Phasellus in enim lobortis, volutpat orci sit amet, scelerisque tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin ultricies in nulla et facilisis. Pellentesque justo ipsum, pellentesque sed convallis et, feugiat quis nulla. Aliquam maximus elementum nisl non rutrum. Suspendisse id malesuada ante. Phasellus commodo ex quis orci iaculis finibus.
|
||||
@@ -0,0 +1 @@
|
||||
Etiam porttitor ligula fermentum mauris laoreet, a ultrices nibh scelerisque. Quisque erat mauris, rutrum quis pretium vitae, sollicitudin nec nisl. Etiam pretium est a commodo elementum. In lectus elit, semper eget aliquet nec, eleifend ut velit. Phasellus feugiat neque malesuada purus congue, in tincidunt dolor finibus. Proin eu bibendum velit. Aliquam Njko-60603 tincidunt euismod justo, vel elementum tellus semper eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean iaculis metus mauris, ut porttitor dolor volutpat a. Proin porttitor enim at tincidunt sollicitudin. Maecenas auctor pretium tempus. Nunc sit amet mi nunc.
|
||||
@@ -0,0 +1 @@
|
||||
Etiam porttitor ligula fermentum mauris laoreet, a ultrices nibh scelerisque. Quisque erat mauris, rutrum quis pretium vitae, sollicitudin nec nisl. Etiam pretium est a commodo elementum. In lectus elit, semper eget aliquet nec, eleifend ut velit. Phasellus feugiat neque malesuada purus congue, in tincidunt dolor finibus. Proin eu bibendum velit. Aliquam tincidunt euismod justo, vel elementum tellus semper eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean iaculis metus mauris, ut porttitor dolor volutpat a. Proin porttitor enim at tincidunt sollicitudin. Maecenas auctor pretium tempus. Nunc sit amet mi nunc.
|
||||
@@ -0,0 +1 @@
|
||||
Fusce at ornare sapien. Curabitur vestibulum nibh in neque tincidunt, non interdum ante semper. Vivamus eget scelerisque eros. Vestibulum egestas elementum congue. Ut hendrerit ultrices nunc, quis elementum arcu. Fusce ullamcorper quam accumsan, commodo augue ac, viverra ipsum. Pellentesque venenatis vehicula felis id placerat. Praesent mollis lobortis lorem, vel efficitur risus mollis eget. Quisque molestie sapien quis enim ultrices mollis nec eu lacus.
|
||||
@@ -0,0 +1 @@
|
||||
Etiam porttitor ligula fermentum mauris laoreet, a ultrices nibh scelerisque. Quisque erat mauris, rutrum quis pretium vitae, sollicitudin nec nisl. Etiam pretium est a commodo elementum. In lectus elit, semper eget aliquet nec, eleifend ut velit. Phasellus feugiat neque malesuada purus congue, in tincidunt dolor finibus. Proin eu bibendum velit. Aliquam tincidunt euismod justo, vel elementum tellus semper eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean iaculis metus mauris, ut porttitor dolor volutpat a. Proin porttitor enim at tincidunt sollicitudin. Maecenas auctor pretium tempus. Nunc sit amet mi nunc.
|
||||
@@ -0,0 +1 @@
|
||||
Curabitur eget bibendum dolor. Praesent eu metus ac neque convallis pharetra. Phasellus in enim lobortis, volutpat orci sit amet, scelerisque tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin ultricies in nulla et facilisis. Pellentesque justo ipsum, pellentesque sed convallis et, feugiat quis nulla. Aliquam maximus elementum nisl non rutrum. Suspendisse id malesuada ante. Phasellus commodo ex quis orci iaculis finibus.
|
||||
@@ -0,0 +1 @@
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent in tellus porta, vehicula nisl vel, ultrices orci. Mauris egestas, lectus eget consectetur dictum, dui lectus suscipit nulla, vitae tristique elit orci dignissim elit. Sed fermentum elementum odio, sit amet rhoncus nibh pellentesque eu. Proin sit amet porttitor lorem. Cras urna orci, molestie a semper quis, commodo non augue. Vestibulum blandit pellentesque lectus, sit amet dignissim orci finibus quis. In sem metus, pellentesque eget ultrices ac, tempor eleifend ligula.
|
||||
@@ -0,0 +1 @@
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent in tellus porta, vehicula nisl vel, ultrices orci. Mauris egestas, lectus eget consectetur dictum, dui lectus suscipit nulla, vitae tristique elit orci dignissim elit. Sed fermentum elementum odio, sit amet rhoncus nibh pellentesque eu. Nbbg-90999 Proin sit amet porttitor lorem. Cras urna orci, molestie a semper quis, commodo non augue. Vestibulum blandit pellentesque lectus, sit amet dignissim orci finibus quis. In sem metus, pellentesque eget ultrices ac, tempor eleifend ligula.
|
||||
@@ -0,0 +1 @@
|
||||
Fusce at ornare sapien. Curabitur vestibulum nibh in neque tincidunt, non interdum ante semper. Vivamus eget scelerisque eros. Vestibulum egestas elementum congue. Ut hendrerit ultrices nunc, quis elementum arcu. Fusce ullamcorper quam accumsan, commodo augue ac, viverra ipsum. Pellentesque venenatis vehicula felis id placerat. Praesent mollis lobortis lorem, vel efficitur risus mollis eget. Quisque molestie sapien quis enim ultrices mollis nec eu lacus.
|
||||
@@ -0,0 +1 @@
|
||||
Fusce at ornare sapien. Curabitur vestibulum nibh in neque tincidunt, non interdum ante semper. Vivamus eget scelerisque eros. Vestibulum egestas elementum congue. Ut hendrerit ultrices nunc, quis elementum arcu. Fusce ullamcorper quam accumsan, commodo augue ac, viverra ipsum. Pellentesque venenatis vehicula felis id placerat. Praesent mollis lobortis lorem, vel efficitur risus mollis eget. Quisque molestie sapien quis enim ultrices mollis nec eu lacus.
|
||||
@@ -0,0 +1 @@
|
||||
Fusce at ornare sapien. Curabitur vestibulum nibh in neque tincidunt, non interdum ante semper. Vivamus eget scelerisque eros. Vestibulum egestas elementum congue. Ut hendrerit ultrices nunc, quis elementum arcu. Fusce ullamcorper quam accumsan, commodo augue ac, viverra ipsum. Pellentesque venenatis vehicula felis id placerat. Praesent mollis lobortis lorem, vel efficitur risus mollis eget. Quisque molestie sapien quis enim ultrices mollis nec eu lacus.
|
||||
@@ -0,0 +1 @@
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent in tellus porta, vehicula nisl vel, ultrices orci. Mauris egestas, lectus eget consectetur dictum, dui lectus suscipit nulla, vitae tristique elit orci dignissim elit. Sed fermentum elementum odio, sit amet rhoncus nibh pellentesque eu. Proin sit amet porttitor lorem. Cras urna orci, molestie a semper quis, commodo non augue. Vestibulum blandit pellentesque lectus, sit amet dignissim orci finibus quis. In sem metus, pellentesque eget ultrices ac, tempor eleifend ligula.
|
||||
@@ -0,0 +1 @@
|
||||
Etiam porttitor ligula fermentum mauris laoreet, a ultrices nibh scelerisque. Quisque erat mauris, rutrum quis pretium vitae, sollicitudin nec nisl. Etiam pretium est a commodo elementum. In lectus elit, semper eget aliquet nec, eleifend ut velit. Phasellus feugiat neque malesuada purus congue, in tincidunt dolor finibus. Proin eu bibendum velit. Aliquam tincidunt euismod justo, vel elementum tellus semper eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean iaculis metus mauris, ut porttitor dolor volutpat a. Proin porttitor enim at tincidunt sollicitudin. Maecenas auctor pretium tempus. Nunc sit amet mi nunc.
|
||||
@@ -0,0 +1 @@
|
||||
Etiam porttitor ligula fermentum mauris laoreet, a ultrices nibh scelerisque. Quisque erat mauris, rutrum quis pretium vitae, sollicitudin nec nisl. Etiam pretium est a commodo elementum. In lectus elit, semper eget aliquet nec, eleifend ut velit. Phasellus feugiat neque malesuada purus congue, in tincidunt dolor finibus. Proin eu bibendum velit. Aliquam tincidunt euismod justo, vel elementum tellus semper eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean iaculis metus mauris, ut porttitor dolor volutpat a. Proin porttitor enim at tincidunt sollicitudin. Maecenas auctor pretium tempus. Nunc sit amet mi nunc.
|
||||
@@ -0,0 +1 @@
|
||||
Curabitur eget bibendum dolor. Praesent eu metus ac neque convallis pharetra. Phasellus in enim lobortis, volutpat orci sit amet, scelerisque tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin ultricies in nulla et facilisis. Pellentesque justo ipsum, pellentesque sed convallis et, feugiat quis nulla. Aliquam maximus elementum nisl non rutrum. Suspendisse id malesuada ante. Phasellus commodo ex quis orci iaculis finibus.
|
||||
@@ -0,0 +1 @@
|
||||
Etiam porttitor ligula fermentum mauris laoreet, a ultrices nibh scelerisque. Quisque erat mauris, rutrum quis pretium vitae, sollicitudin nec nisl. Etiam pretium est a commodo elementum. In lectus elit, semper eget aliquet nec, eleifend ut velit. Phasellus feugiat neque malesuada purus congue, in tincidunt dolor Nwwe-88985 Proin eu bibendum velit. Aliquam tincidunt euismod justo, vel elementum tellus semper eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean iaculis metus mauris, ut porttitor dolor volutpat a. Proin porttitor enim at tincidunt sollicitudin. Maecenas auctor pretium tempus. Nunc sit amet mi nunc.
|
||||
@@ -0,0 +1 @@
|
||||
Curabitur eget bibendum dolor. Praesent eu metus ac neque convallis pharetra. Phasellus in enim lobortis, volutpat orci sit amet, scelerisque tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin ultricies in nulla et facilisis. Pellentesque justo ipsum, pellentesque sed convallis et, feugiat quis nulla. Aliquam maximus elementum nisl non rutrum. Suspendisse id malesuada ante. Phasellus commodo ex quis orci iaculis finibus.
|
||||
@@ -0,0 +1 @@
|
||||
Fusce at ornare sapien. Curabitur vestibulum nibh in neque tincidunt, non interdum ante semper. Vivamus eget scelerisque eros. Vestibulum egestas elementum congue. Ut hendrerit ultrices nunc, quis elementum arcu. Fusce ullamcorper quam accumsan, commodo augue ac, viverra ipsum. Pellentesque venenatis vehicula felis id placerat. Praesent mollis lobortis lorem, vel efficitur risus mollis eget. Quisque molestie sapien quis enim ultrices mollis nec eu lacus.
|
||||
@@ -0,0 +1 @@
|
||||
Fusce at ornare sapien. Curabitur vestibulum nibh in neque tincidunt, non interdum ante semper. Vivamus eget scelerisque eros. Vestibulum egestas elementum congue. Ut hendrerit ultrices nunc, quis elementum arcu. Fusce ullamcorper quam accumsan, commodo augue ac, viverra ipsum. Pellentesque venenatis vehicula felis id placerat. Praesent mollis lobortis lorem, vel efficitur risus mollis eget. Quisque molestie sapien quis enim ultrices mollis nec eu lacus.
|
||||
@@ -0,0 +1 @@
|
||||
Curabitur eget bibendum dolor. Praesent eu metus ac neque convallis pharetra. Phasellus in enim lobortis, volutpat orci sit amet, scelerisque tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Naac-11022 Proin ultricies in nulla et facilisis. Pellentesque justo ipsum, pellentesque sed convallis et, feugiat quis nulla. Aliquam maximus elementum nisl non rutrum. Suspendisse id malesuada ante. Phasellus commodo ex quis orci iaculis finibus.
|
||||
@@ -0,0 +1 @@
|
||||
Etiam porttitor ligula fermentum mauris laoreet, a ultrices nibh scelerisque. Quisque erat mauris, rutrum quis pretium vitae, sollicitudin nec nisl. Etiam pretium est a commodo elementum. In lectus elit, semper eget aliquet nec, eleifend ut velit. Phasellus feugiat neque malesuada purus congue, in tincidunt dolor finibus. Proin eu bibendum velit. Aliquam tincidunt euismod justo, vel elementum tellus semper eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean iaculis metus mauris, ut porttitor dolor volutpat a. Proin porttitor enim at tincidunt sollicitudin. Maecenas auctor pretium tempus. Nunc sit amet mi nunc.
|
||||
@@ -0,0 +1 @@
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent in tellus porta, vehicula nisl vel, ultrices orci. Mauris egestas, lectus eget consectetur dictum, dui lectus suscipit nulla, vitae tristique Nerp-66532 elit orci dignissim elit. Sed fermentum elementum odio, sit amet rhoncus nibh pellentesque eu. Proin sit amet porttitor lorem. Cras urna orci, molestie a semper quis, commodo non augue. Vestibulum blandit pellentesque lectus, sit amet dignissim orci finibus quis. In sem metus, pellentesque eget ultrices ac, tempor eleifend ligula.
|
||||
109
python-total/dia_09/09_Programa09/buscador_num_serie.py
Normal file
109
python-total/dia_09/09_Programa09/buscador_num_serie.py
Normal file
@@ -0,0 +1,109 @@
|
||||
"""
|
||||
Programa día 9 - Buscador de números de serie
|
||||
|
||||
- Recorrer todos los archivos
|
||||
y subcarpetas de directorio raiz Mi_Gran_Directorio. método walk() de os.
|
||||
- Buscar string qye coincida con un patrón de número de serie
|
||||
- Como mucho un número de serie por fichero.
|
||||
módulo os para abrir e iterear por el directorio
|
||||
expresiones regulares para encontrar el formato de número de serie correcto.
|
||||
Formato:
|
||||
[N] + [tres carateres de texto] + [-] + [5 números]
|
||||
Ejemplo: Nryu-12365
|
||||
Presentación de resultados:
|
||||
----------------------------------------------------
|
||||
Fecha de búsqueda: [fecha de hoy - formato dd/mm/aa]
|
||||
|
||||
ARCHIVO NRO. SERIE
|
||||
------- ----------
|
||||
texto1.txt Nter-15496
|
||||
texto25.txt Ngba-85235
|
||||
|
||||
Números encontrados: 2
|
||||
Duración de la búsqueda: 1 segundos
|
||||
----------------------------------------------------
|
||||
|
||||
- La 'Duración de búsqueda' debe estar redondeada hacia arriba
|
||||
|
||||
"""
|
||||
|
||||
from datetime import date
|
||||
import os
|
||||
from pathlib import Path
|
||||
import re
|
||||
import time
|
||||
import math
|
||||
|
||||
|
||||
def fecha_hoy():
|
||||
"""
|
||||
Devuelve la fecha actual
|
||||
"""
|
||||
|
||||
hoy = date.today().strftime('%d/%m/%Y')
|
||||
fecha = f'\nFecha de búsqueda: {hoy}'
|
||||
|
||||
return fecha
|
||||
|
||||
|
||||
def abrir_fichero(file_path):
|
||||
"""
|
||||
Recoge un path de un fichero
|
||||
y devuelve el contenido del fichero
|
||||
"""
|
||||
|
||||
with open(file_path, encoding="utf-8") as file:
|
||||
contenido = file.read()
|
||||
|
||||
return contenido
|
||||
|
||||
|
||||
def busqueda_serie():
|
||||
"""
|
||||
Buscador
|
||||
"""
|
||||
|
||||
patron = r'N\D{3}-\d{5}'
|
||||
ruta = './Mi_Gran_Directorio'
|
||||
lista_filas = []
|
||||
|
||||
for root, sub, fichero in os.walk(ruta):
|
||||
if fichero:
|
||||
for arch in fichero:
|
||||
sub.clear()
|
||||
texto = abrir_fichero(Path(root, arch))
|
||||
busqueda = re.findall(patron, texto)
|
||||
if re.findall(patron, texto):
|
||||
fila = f'{arch}\t| {busqueda[0]}\t| {root}'
|
||||
lista_filas.append(fila)
|
||||
|
||||
lista_filas.sort()
|
||||
return lista_filas
|
||||
|
||||
|
||||
def tiempo_ejecucion():
|
||||
"""
|
||||
Ejecuta la búsqueda y devuelve
|
||||
- La busqueda
|
||||
- El contador
|
||||
- El tiempo de ejecución
|
||||
"""
|
||||
|
||||
inicio = time.time()
|
||||
busqueda_serie()
|
||||
final = time.time()
|
||||
tiempo_total = math.ceil(final - inicio)
|
||||
|
||||
return tiempo_total
|
||||
|
||||
|
||||
print(f'\n{fecha_hoy()}')
|
||||
|
||||
print("""
|
||||
NOMBRE ARCHIVO\t| NRO. SERIE\t| UBICACIÓN DEL FICHERO
|
||||
--------------\t| ----------\t| ---------------------""")
|
||||
for f in busqueda_serie():
|
||||
print(f)
|
||||
|
||||
print(f'\nNúmeros encontrados: {len(busqueda_serie())}')
|
||||
print(f'Duración de la búsqueda: {tiempo_ejecucion()} seg.\n')
|
||||
BIN
python-total/dia_09/Proyecto+Dia+9.zip
Normal file
BIN
python-total/dia_09/Proyecto+Dia+9.zip
Normal file
Binary file not shown.
265
python-total/dia_09/README.md
Normal file
265
python-total/dia_09/README.md
Normal file
@@ -0,0 +1,265 @@
|
||||
# Día 9 - Programa un buscador de números de serie
|
||||
|
||||
## Índice
|
||||
- [Día 9 - Programa un buscador de números de serie](#día-9---programa-un-buscador-de-números-de-serie)
|
||||
- [Índice](#índice)
|
||||
- [9.1. - Módulo collections](#91---módulo-collections)
|
||||
- [9.2. - Módulos shutil \& os](#92---módulos-shutil--os)
|
||||
- [9.3. - Módulo datetime](#93---módulo-datetime)
|
||||
- [9.4. - Módulo para medir el tiempo](#94---módulo-para-medir-el-tiempo)
|
||||
- [9.5. - Módulo math](#95---módulo-math)
|
||||
- [9.6. - Expresiones regulares](#96---expresiones-regulares)
|
||||
- [9.7. - Comprimir y descomprimir archivos](#97---comprimir-y-descomprimir-archivos)
|
||||
- [9.8. - Proyecto del Día 9](#98---proyecto-del-día-9)
|
||||
- [Ficheros y documentación](#ficheros-y-documentación)
|
||||
|
||||
## 9.1. - Módulo collections
|
||||
|
||||
El módulo Collections amplía los tipos de contenedores disponibles en Python. Un contenedor almacena diferentes objetos y proporciona una nueva forma de acceder e iterar sobre los mismos.
|
||||
|
||||
**Counters (Contadores)**: Es una subclase del **diccionario**, usado para contar las repeticiones de cada elemento en un iterable, en forma de diccionario:
|
||||
```python
|
||||
from collections import Counter
|
||||
|
||||
Counter(iterable)
|
||||
```
|
||||
|
||||
Counter({'valor': repeticiones, ...})
|
||||
|
||||
**DefaultDict**: Es una subclase del diccionario, usado para proporcionar valores por defecto para las claves que no existan, sin generar un mensaje de error. El valor por defecto puede ser un tipo de dato (int, list, etc.) o una función lambda que proporcione dicho valor directamente (lambda: "mi valor").
|
||||
```python
|
||||
from collections import defaultdict
|
||||
mi_dic = defaultdict(lambda: "No encontrado")
|
||||
```
|
||||
|
||||
**NamedTuple**: devuelve una tupla donde las posiciones de sus elementos tienen un nombre, además de un número de índice como las tuplas tradicionales.
|
||||
```python
|
||||
from collections import namedtuple
|
||||
|
||||
# nombres de los elementos
|
||||
mi_tupla= namedtuple('Persona',['nombre','edad','altura'])
|
||||
persona1 = Persona("Marcos", 39, 1.88)
|
||||
```
|
||||
|
||||
## 9.2. - Módulos shutil & os
|
||||
El módulo Shutil ofrece funcionalidades de alto nivel sobre archivos, tales como copiar, crear, eliminar y mover entre directorios. También mencionaremos métodos del módulo os que cumplen objetivos similares.
|
||||
```python
|
||||
import shutil
|
||||
```
|
||||
|
||||
- **shutil.move(archivo, directorio)** : mueve un archivo desde el directorio actual hacia aquel que se especifica en el segundo parámetro.
|
||||
- **os.unlink(directorio)** : elimina un archivo del directorio indicado
|
||||
- **os.rmdir(directorio)** : elimina una carpeta vacía
|
||||
• shutil.rmtree(directorio) : elimina una carpeta indicada en el directorio, incluyendo todas sus ramificaciones (subcarpetas y archivos), de manera definitiva y sin pasar por la papelera de reciclaje.
|
||||
- **send2trash.send2trash(archivo)** : envía un archivo a la papelera de reciclaje (es necesario instalar el módulo desde "`pip install Send2Trash`" y luego importarlo)
|
||||
- **os.walk(directorio)** : recorre el directorio indicado, y devuelve los nombres de carpetas, subcarpetas y archivos dentro de ellas en forma de tupla, a través de un generador.
|
||||
## 9.3. - Módulo datetime
|
||||
|
||||
El módulo datetime (incorporado en Python) puede importarse en proyectos para trabajar con fechas y horas, así como intervalos y duraciones.
|
||||
```python
|
||||
import datetime
|
||||
```
|
||||
|
||||
fecha:
|
||||
```python
|
||||
mi_fecha = datetime.date(año,mes,día)
|
||||
```
|
||||
|
||||
año,mes,día son integers comprendidos en los rangos de fechas "reales" (12 meses y 31 días como máximo). También podemos extraer el año, mes y día individualmente:
|
||||
```python
|
||||
anio = mi_fecha.year
|
||||
mes = mi_fecha.month
|
||||
dia = mi_fecha.day
|
||||
```
|
||||
|
||||
```python
|
||||
hoy = datetime.date.today() # obtener el día actual
|
||||
```
|
||||
|
||||
hora:
|
||||
```python
|
||||
mi_hora = datetime.time(hora, minuto, segundo, microsegundo)
|
||||
```
|
||||
|
||||
Todos los argumentos son opcionales (se asumen 0 si no se indican), y deben estar comprendidos entre 0 y 24 para las horas, 0 y 60 para minutos y segundos, y 0 y 1000000 para los microsegundos.
|
||||
fecha y hora:
|
||||
combina fechas y horas
|
||||
```python
|
||||
fecha_hora = datetime.datetime(año, mes, día, hora, minuto, segundo, microseg)
|
||||
ahora = datetime.datetime.now() # obtener fecha y hora actual
|
||||
hora = ahora.hour
|
||||
minuto = ahora.minute
|
||||
segundo = ahora.second
|
||||
# obtener horas, minutos y segundos
|
||||
```
|
||||
|
||||
## 9.4. - Módulo para medir el tiempo
|
||||
|
||||
Estudiar el tiempo transcurrido durante la ejecución de un código nos permite conocerlo mejor y tomar decisiones acerca de la vía más eficiete para resolver un problema. Tenemos dos módulos que nos ayudarán: time y timeit.
|
||||
|
||||
Utilizando time:
|
||||
```python
|
||||
inicio = time.time()
|
||||
[código]
|
||||
final = time.time()
|
||||
duracion = final - inicio # para funciones que toman varios segundos para ejecutarse
|
||||
```
|
||||
|
||||
Utilizando timeit:
|
||||
```python
|
||||
duracion = timeit.timeit(declaracion, setup, number = numero)
|
||||
```
|
||||
|
||||
**declaracion**: recibe el código que cuya duración de ejecución queremos medir
|
||||
→ es la invocación mi función
|
||||
|
||||
**setup**: recibe las instrucciones que el parámetro declaracion requiere para funcionar
|
||||
→ es la definición (def...) de mi función
|
||||
|
||||
**number**: cantidad de veces que se evaluará el código para obtener su tiempo de ejecución mínimo.
|
||||
→ pueden ser varios miles o cientos de veces (dependiendo de la complejidad)
|
||||
|
||||
## 9.5. - Módulo math
|
||||
|
||||
El módulo math contiene un conjunto de métodos y constantes que se pueden utilizar para resolver tareas matemáticas de mayor complejidad. Es el equivalente a la calculadora científica dentro de Python.
|
||||
Algunas de las situaciones que pueden ayudarnos a resolver son:
|
||||
|
||||
- **Relaciones trigonométricas** (seno, coseno, tangente, sus inversas e hiperbólicas)
|
||||
- **Funciones logarítmicas**
|
||||
- **Potencias y raíces**
|
||||
- **Combinatoria y permutaciones**
|
||||
- **Redondeos**
|
||||
- **Factoriales**
|
||||
|
||||
... entre muchas otras (¡te recomendamos leer su documentación de acuerdo con tus necesidades!)
|
||||
|
||||
Las constantes que encontrarás:
|
||||
- **Pi** (3.1415...)
|
||||
- **e o Constante de Euler** (2.7182...)
|
||||
- **Tau** (6.2831...)
|
||||
- **Infinito** (el concepto matemático de infinito positivo)
|
||||
- **Nulo** (NaN: not-a-number)
|
||||
|
||||
## 9.6. - Expresiones regulares
|
||||
|
||||
Una expresión regular es una secuencia de caracteres que forman un patrón de búsqueda determinado. Pueden ser utilizadas para verificar strings en búsqueda de un contenido (patrón) específico. Utilizamos el módulo re en Python.
|
||||
```python
|
||||
import re
|
||||
```
|
||||
|
||||
Funciones:
|
||||
- **search( )**: devuelve un objeto "match" que contiene información acerca del hallazgo si se encuentra en algún punto del string
|
||||
- **findall( )**: devuelve una lista que contiene todos los hallazgos del patrón
|
||||
|
||||
Para formar patrones, utilizamos los siguientes cuantificadores y caracteres especiales.
|
||||
|
||||
**Operadores especiales:**
|
||||
|
||||
| Operador | Descripción |
|
||||
| :------: | :--------------------- |
|
||||
| [ ] | Un set de caracteres |
|
||||
| . | Un carácter cualquiera |
|
||||
| ^ | Inicia con |
|
||||
| $ | Finaliza con |
|
||||
| \| | Operador lógico "O" |
|
||||
|
||||
**Cuantificadores: **
|
||||
|
||||
| Cuantificador | Descripción |
|
||||
| :-----------: | :------------------------------------ |
|
||||
| * | Cero o más ocurrencias: 0 – n |
|
||||
| + | Una o más ocurrencias: 1 – n |
|
||||
| ? | Cero o una ocurrencia: 0 – 1 |
|
||||
| { } | Un número especificado de ocurrencias |
|
||||
| {n} | Se repite n veces |
|
||||
| {n,m} | Se repite de n a m veces |
|
||||
| {n, } | Se repite de n veces hacia arriba |
|
||||
|
||||
**Carácteres especiales:**
|
||||
|
||||
| Carácter | Descripción |
|
||||
| :-------: | :--------------------------- |
|
||||
| \d | Dígito numérico |
|
||||
| \D | NO numérico |
|
||||
| \w | Carácter alfanumérico |
|
||||
| \W | NO alfanumérico |
|
||||
| \s | Espacio en blanco |
|
||||
| \S | NO espacio en blanco |
|
||||
| patron | r'\w{4}\d{4}' |
|
||||
| verificar | re.search(patron,"cont1234") |
|
||||
|
||||
Expresiones regulares python online: https://pythex.org/
|
||||
|
||||
## 9.7. - Comprimir y descomprimir archivos
|
||||
|
||||
El formato zip permite comprimir archivos sin pérdida de información, ahorrando espacio de almacenamiento y manteniendo documentos relacionados en un mismo archivo .zip.
|
||||
|
||||
Utilizando el módulo zipfile:
|
||||
```python
|
||||
import zipfile
|
||||
```
|
||||
|
||||
Comprimir archivos:
|
||||
```python
|
||||
mi_zip = zipfile.ZipFile("archivo_comprimido.zip", "w") # modo escritura
|
||||
mi_zip.write("mi_archivo.txt") # comprimir archivo en mi_zip
|
||||
mi_zip.close()
|
||||
```
|
||||
|
||||
Descomprimir archivos:
|
||||
```python
|
||||
mi_zip = zipfile.ZipFile("archivo_comprimido.zip", "r")
|
||||
mi_zip.extractall() # extraer todos los archivos de mi_zip
|
||||
mi_zip.extract("mi_archivo.txt") # extraer un archivo específico
|
||||
```
|
||||
|
||||
Utilizando el módulo shutil:
|
||||
```python
|
||||
import shutil
|
||||
```
|
||||
|
||||
Comprimir archivos:
|
||||
```python
|
||||
shutil.make_archive(archivo_destino, "zip", carpeta_origen)
|
||||
```
|
||||
|
||||
Descomprimir archivos:
|
||||
```python
|
||||
shutil.unpack_archive(archivo_zip, nombre_carpeta_extraccion, "zip")
|
||||
```
|
||||
|
||||
## 9.8. - Proyecto del Día 9
|
||||
|
||||
A esta altura del día ya estoy un poco cansado, así que vamos a hacer algo distinto en esta ocasión. Esta vez, en vez de explicarte los detalles del proyecto del día de hoy, los vas a tener que encontrar tú mismo.
|
||||
|
||||
Junto a esta lección, vas a encontrar un archivo zip descargable. Descárgalo, guárdalo en la misma carpeta donde vas a guardar tus archivos de Python para este proyecto, y luego quiero que descomprimas ese archivo para encontrar las consignas del proyecto de hoy. Pero no hagas trampa: la idea es que descomprimas ese archivo usando el código que has aprendido el día de hoy, y lo que vas a encontrar ahí, es un archivo llamado Instrucciones. Ese archivo tiene todo lo que necesitas para ponerte a trabajar.
|
||||
|
||||
Así que manos a la obra, y nos vemos en un rato para mostrarte mi solución al proyecto del día de hoy.
|
||||
|
||||
## Ficheros y documentación
|
||||
|
||||
- [01_modulo_collections.py](01_modulo_collections.py)
|
||||
- [02_modulo_os_shutil.py](02_modulo_os_shutil.py)
|
||||
- [03_modulo_datetime_1.py](03_modulo_datetime_1.py)
|
||||
- [03_modulo_datetime_2.py](03_modulo_datetime_2.py)
|
||||
- [04_modulo_medir_tiempo.py](04_modulo_medir_tiempo.py)
|
||||
- [05_modulo_math.py](05_modulo_math.py)
|
||||
- [06_modulo_re.py](06_modulo_re.py)
|
||||
- [07_modulo_comprimir_shutil.py](07_modulo_comprimir_shutil.py)
|
||||
- [07_modulo_comprimir_zipfile.py](07_modulo_comprimir_zipfile.py)
|
||||
- [07_modulo_descomprimir_shutil.py](07_modulo_descomprimir_shutil.py)
|
||||
- [07_modulo_descomprimir_zipfile.py](07_modulo_descomprimir_zipfile.py)
|
||||
- [08_Descomprimir_proyecto.py](08_Descomprimir_proyecto.py)
|
||||
- [09_Programa09](09_Programa09.py)
|
||||
- [carpeta_superior](carpeta_superior)
|
||||
- [extraccion_terminada](extraccion_terminada)
|
||||
- [mi_texto_A.txt](mi_texto_A.txt)
|
||||
- [mi_texto_B.txt](mi_texto_B.txt)
|
||||
- [Proyecto+Dia+9.zip](Proyecto+Dia+9.zip)
|
||||
- [todo_comprimido.zip](todo_comprimido.zip)
|
||||
|
||||
[Documentación del día](../doc_curso/09_buscador_numeros_serie/)
|
||||
|
||||
---
|
||||
|
||||
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)
|
||||
0
python-total/dia_09/carpeta_superior/fichero1
Normal file
0
python-total/dia_09/carpeta_superior/fichero1
Normal file
0
python-total/dia_09/carpeta_superior/fichero2
Normal file
0
python-total/dia_09/carpeta_superior/fichero2
Normal file
0
python-total/dia_09/extraccion_terminada/fichero1
Normal file
0
python-total/dia_09/extraccion_terminada/fichero1
Normal file
0
python-total/dia_09/extraccion_terminada/fichero2
Normal file
0
python-total/dia_09/extraccion_terminada/fichero2
Normal file
9
python-total/dia_09/mi_texto_A.txt
Normal file
9
python-total/dia_09/mi_texto_A.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla accumsan feugiat elit, sit amet consequat elit efficitur congue. Maecenas et turpis turpis. Pellentesque viverra nulla orci, non ornare neque dapibus ultricies. Pellentesque molestie semper augue, a tristique risus pulvinar eget. Nunc vulputate eget magna eu accumsan. Vestibulum ante dolor, varius vel lorem non, cursus dapibus lectus. Morbi et metus sollicitudin, tincidunt neque sed, faucibus augue. Sed felis diam, ullamcorper ac consequat eu, dictum nec purus. Phasellus ultricies nisi arcu, id consequat lorem suscipit at. Nulla facilisi.
|
||||
|
||||
Proin ultrices maximus ipsum eu ultricies. Cras consequat elit in lorem posuere euismod. Etiam nec enim ac urna aliquam facilisis ut in elit. Mauris sagittis libero justo, sed tempus lacus bibendum eu. Sed sit amet posuere sapien, vel iaculis nulla. Morbi bibendum turpis sed turpis fringilla, sit amet aliquet libero cursus. Nam consequat odio aliquet, scelerisque enim a, fringilla ligula. Donec varius lacus ut arcu finibus, id consectetur sapien consequat. Aliquam quam libero, iaculis vel justo a, facilisis porttitor velit. Vivamus sit amet scelerisque ipsum. Donec lobortis, leo nec eleifend viverra, mi erat tristique ligula, et tristique urna ipsum id arcu. Aenean sem ipsum, aliquet eget odio vitae, pellentesque blandit massa. Maecenas odio nibh, tempus sed aliquam non, laoreet quis diam. Ut ac aliquam massa, sit amet tristique tortor. Morbi ornare elit nec tellus convallis, sit amet tempus diam volutpat. Aliquam ac molestie dolor, eget sollicitudin neque.
|
||||
|
||||
Nullam fermentum, ipsum sed consectetur dapibus, ligula nisl pretium turpis, at condimentum magna elit vitae tellus. Nullam semper ipsum a porta lacinia. Mauris ex tortor, auctor eget nunc at, imperdiet scelerisque est. In hendrerit odio vitae sem ullamcorper consectetur. Praesent quis ornare tortor. Vestibulum accumsan metus erat, sed bibendum enim cursus quis. Praesent libero dui, sagittis quis urna a, sollicitudin viverra ante. Sed congue auctor mi eu ultrices. Curabitur quis finibus eros, sit amet molestie ante. Proin in diam aliquam, porta ante eu, cursus tellus. Sed sodales sem justo, at convallis odio facilisis a. Nam accumsan nisi et finibus vehicula. Nullam pharetra dolor eu nibh congue, non condimentum arcu imperdiet. Nam efficitur dapibus sem et dictum. Praesent euismod erat at convallis ullamcorper. Curabitur ut sem eleifend nunc porta porta.
|
||||
|
||||
Pellentesque malesuada risus eu pharetra tincidunt. Integer at lectus laoreet, venenatis urna ac, porttitor felis. Mauris volutpat pulvinar nulla, a dapibus erat venenatis eu. Sed diam nisi, accumsan et augue id, consequat facilisis elit. Nunc in turpis ut diam aliquet bibendum nec vel velit. Nam vel leo vitae ante fringilla faucibus. Proin condimentum eleifend magna, eleifend consectetur mauris ullamcorper a. Fusce interdum neque id purus volutpat rhoncus. Etiam consequat vehicula faucibus. Etiam vel sollicitudin felis, quis iaculis enim. Aenean ullamcorper a erat vel elementum. Donec eu mattis tortor. Mauris suscipit consequat dui non molestie.
|
||||
|
||||
Integer viverra auctor nunc, et laoreet lacus. Fusce mattis convallis nisl, eu tincidunt lectus iaculis id. Mauris erat metus, pretium ac suscipit id, iaculis id lacus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas finibus varius mauris, vitae dictum leo viverra quis. Etiam vel massa in lorem tempor rhoncus non ornare magna. Donec eleifend vestibulum nisl sed lobortis. Suspendisse in orci hendrerit, pulvinar nibh at, lacinia nulla. Nullam posuere pharetra nibh. Aliquam metus ipsum, suscipit a sem vitae, gravida vehicula orci. Cras fermentum sapien vitae dapibus feugiat. Morbi eget arcu et nulla pharetra sagittis vitae vel risus. Nulla facilisi. Vestibulum at mi eget dolor luctus iaculis.
|
||||
9
python-total/dia_09/mi_texto_B.txt
Normal file
9
python-total/dia_09/mi_texto_B.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla accumsan feugiat elit, sit amet consequat elit efficitur congue. Maecenas et turpis turpis. Pellentesque viverra nulla orci, non ornare neque dapibus ultricies. Pellentesque molestie semper augue, a tristique risus pulvinar eget. Nunc vulputate eget magna eu accumsan. Vestibulum ante dolor, varius vel lorem non, cursus dapibus lectus. Morbi et metus sollicitudin, tincidunt neque sed, faucibus augue. Sed felis diam, ullamcorper ac consequat eu, dictum nec purus. Phasellus ultricies nisi arcu, id consequat lorem suscipit at. Nulla facilisi.
|
||||
|
||||
Proin ultrices maximus ipsum eu ultricies. Cras consequat elit in lorem posuere euismod. Etiam nec enim ac urna aliquam facilisis ut in elit. Mauris sagittis libero justo, sed tempus lacus bibendum eu. Sed sit amet posuere sapien, vel iaculis nulla. Morbi bibendum turpis sed turpis fringilla, sit amet aliquet libero cursus. Nam consequat odio aliquet, scelerisque enim a, fringilla ligula. Donec varius lacus ut arcu finibus, id consectetur sapien consequat. Aliquam quam libero, iaculis vel justo a, facilisis porttitor velit. Vivamus sit amet scelerisque ipsum. Donec lobortis, leo nec eleifend viverra, mi erat tristique ligula, et tristique urna ipsum id arcu. Aenean sem ipsum, aliquet eget odio vitae, pellentesque blandit massa. Maecenas odio nibh, tempus sed aliquam non, laoreet quis diam. Ut ac aliquam massa, sit amet tristique tortor. Morbi ornare elit nec tellus convallis, sit amet tempus diam volutpat. Aliquam ac molestie dolor, eget sollicitudin neque.
|
||||
|
||||
Nullam fermentum, ipsum sed consectetur dapibus, ligula nisl pretium turpis, at condimentum magna elit vitae tellus. Nullam semper ipsum a porta lacinia. Mauris ex tortor, auctor eget nunc at, imperdiet scelerisque est. In hendrerit odio vitae sem ullamcorper consectetur. Praesent quis ornare tortor. Vestibulum accumsan metus erat, sed bibendum enim cursus quis. Praesent libero dui, sagittis quis urna a, sollicitudin viverra ante. Sed congue auctor mi eu ultrices. Curabitur quis finibus eros, sit amet molestie ante. Proin in diam aliquam, porta ante eu, cursus tellus. Sed sodales sem justo, at convallis odio facilisis a. Nam accumsan nisi et finibus vehicula. Nullam pharetra dolor eu nibh congue, non condimentum arcu imperdiet. Nam efficitur dapibus sem et dictum. Praesent euismod erat at convallis ullamcorper. Curabitur ut sem eleifend nunc porta porta.
|
||||
|
||||
Pellentesque malesuada risus eu pharetra tincidunt. Integer at lectus laoreet, venenatis urna ac, porttitor felis. Mauris volutpat pulvinar nulla, a dapibus erat venenatis eu. Sed diam nisi, accumsan et augue id, consequat facilisis elit. Nunc in turpis ut diam aliquet bibendum nec vel velit. Nam vel leo vitae ante fringilla faucibus. Proin condimentum eleifend magna, eleifend consectetur mauris ullamcorper a. Fusce interdum neque id purus volutpat rhoncus. Etiam consequat vehicula faucibus. Etiam vel sollicitudin felis, quis iaculis enim. Aenean ullamcorper a erat vel elementum. Donec eu mattis tortor. Mauris suscipit consequat dui non molestie.
|
||||
|
||||
Integer viverra auctor nunc, et laoreet lacus. Fusce mattis convallis nisl, eu tincidunt lectus iaculis id. Mauris erat metus, pretium ac suscipit id, iaculis id lacus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas finibus varius mauris, vitae dictum leo viverra quis. Etiam vel massa in lorem tempor rhoncus non ornare magna. Donec eleifend vestibulum nisl sed lobortis. Suspendisse in orci hendrerit, pulvinar nibh at, lacinia nulla. Nullam posuere pharetra nibh. Aliquam metus ipsum, suscipit a sem vitae, gravida vehicula orci. Cras fermentum sapien vitae dapibus feugiat. Morbi eget arcu et nulla pharetra sagittis vitae vel risus. Nulla facilisi. Vestibulum at mi eget dolor luctus iaculis.
|
||||
BIN
python-total/dia_09/todo_comprimido.zip
Normal file
BIN
python-total/dia_09/todo_comprimido.zip
Normal file
Binary file not shown.
Reference in New Issue
Block a user