¿Te pierdes entre tantos temas? 📚✨ Descubre todo lo que ofrece este blog en un solovistazo [👉 Ver índice completo]
Comandos Básicos de Linux: Guía para Principiantes
2.1 Comandos Básicos de Linux
En este capítulo vamos a desarrollar una pequeña chuleta para poder manejarnos básicamente a través de la terminal de Linux.
Manejo de Directorios
pwd - print working directory
Este comando muestra la ruta completa del directorio actual en el que estás trabajando.
Es útil cuando navegas por muchas carpetas y necesitas saber exactamente dónde estás ubicado dentro del sistema de archivos.
cd - change directory
Por defecto, la secuencia de entrada en linux, nos sitúa en nuestro directorio de entrada o de trabajo (un directorio llamado igual que el usuario, dentro del directorio /home). Pero al igual que otros sistemas operativos podemos cambiar de directorio mediante el mandato cd directorio. Si no introducimos ningún nombre de directorio, el mandato cd, sin argumentos vuelve a nuestro directorio de trabajo. Si queremos volver al directorio de nivel superior basta con utilizar cd ..
Comportamientos comunes:
Ir al directorio Personal (home):
cd
Que es equivalente a:
cd ~
Cambiar a un subdirectorio:
cd nombre_directorio
Volver al directorio anterior (última ubicación)
cd -
Subir un nivel en el árbol de directorios:
cd ..
Ir al directorio raíz del sistema:
cd /
El nombre de un fichero o de un directorio se puede referenciar de forma relativa o absoluta.
Forma relativa: El nombre hace referencia a ficheros o directorios desde el directorio en el que nos encontramos.
Forma absoluta: El nombre hace referencia a todo el camino desde la raíz. Ejemplo: si nos encontramos en nuestro directorio de entrada y queremos ir al directorio /etc
Relativa: Referencia desde tu ubicación actual (ej. cd Documentos).
Absoluta: Referencia desde la raíz (ej. cd /home/usuario/Documentos).
mkdir - make directory
Para crear un directorio (carpeta) es necesario utilizar la orden mkdir nombresDeDirectorio
Si queremos crear un solo directorio:
Si queremos crear varios directorios:
Crear una estructura de directorios anidados (incluye carpetas padre sino existen)
rmdir - Remove Directory
Para borrar un directorio es necesario utilizar la orden rmdir nombresDeDirectorio, es necesario que ese directorio este vacío. ⚠️ Si el directorio contiene archivos o subdirectorios, rmdir no lo eliminará. En ese caso, se debe usar rm -r, pero recuerda utilizarlo con precaución.
Comandos Básicos
date
Permite consultar la fecha y hora del sistema.
who / whoami
who: este comando muestra los usuarios conectados a la máquina.
whoami: Muestra tu nombre de usuario.
ls (Listar archivos)
Este comando muestra el contenido de un directorio. Este comando tiene varias opciones:
ls: Muestra contenido del directorio actual.
Opciones útiles:
ls -a: Muestra además los archivos ocultos (aquellos cuyo nombe empieza con un ".")
ls -F: para saber que archivos de un directorio son archivos normales, cuales directorios y cuales enlaces. (los que terminan con / = directorio, los que terminan con * = ejecutable -código- y los que terminan con @ son enlaces simbólicos) .
ls -t: Ordena por fecha (más reciente primero).
ls -t -r: muestra primero la información más antigua.
ls -R: muestra toda la información del directorio en el que me encuentro.
ls -l: nos muestra más información (el nombre con sus características) sobre el contenido del del directorio donde me encuentro.
Por ejemplo, para el fichero anterior llamado “fichero1” muestra una fila con siete columnas:
Columna 1 - está compuesta por dos partes:
El primer carácter que nos informa sobre el tipo de información que es:
-fichero ordinario
d directorio
l enlace simbólico
los 9 siguientes caracteres nos indican los permisos, estos caracteres se agrupan de tres en tres. Los tres primeros son los permisos para el propietario (r w -), los tres siguientes los permisos para el grupo (r --) y los tres últimos los permisos para el resto de usuarios (---). Los permisos pueden ser de lectura (r), escritura (w) y ejecución (x)
Columna 2 - número de enlaces duros.
Columna 3 - indica el nombre del propietario del fichero.
Columna 4 - grupo al que pertenece el usuario propietario del fichero.
Columna 5 - muestra el tamaño de fichero en bytes.
Columna 6 - Hace referencia a la hora en que el fichero fue modificado por última vez o creado.
Columna 7 - nombre del fichero
ls -i: Muestra el número de inodo de cada archivo.
touch
Sirve para crear fichero en blanco.
Caracteres comodines
A veces es interesante referenciar ficheros que tengan en su nombre características comunes. “Todos los ficheros que empiezan por la letra c...”. En Linux esto se consigue utilizando caracteres especiales (llamados metacaracteres o comodines) que representan otras cosas:
El carácter asterisco '*' representa a cualquier cadena de caracteres arbitraria incluyendo la cadena vacía. (para buscar)
La interrogación '?' representa a cualquier carácter simple. (para buscar)
Los corchetes '[' ']' pueden contener un grupo o rango de caracteres y corresponden a un carácter simple. (para buscar)
Las llaves ‘{‘,’}’ deben contener diferentes alternativas, constituidas por un carácter o un grupo de caracteres, separadas todas ellas por comas. (para buscar / crear). Los dos puntos '..' entre {} en expansión de secuencias se usa para generar rangos automáticamente bien sean números o letras. Por ejemplo, vamos a crear varios ficheros:
Visualización de Archivos
cat
La orden cat se utiliza para visualizar sobre la salida estándar el contenido de un fichero. Lógicamente el tipo de ficheros a visualizar debe ser de texto, ya que si utilizamos la orden con un fichero ejecutable la salida sería ilegible. Para visualizar el fichero de texto llamado prueba:
La orden cat permite listar varios ficheros secuencialmente. Si tenemos dos ficheros llamados prueba1 y prueba2, el siguiente comando nos permite hacerlo:
Una aplicación muy útil de cat, es concatenar ficheros. Por ejemplo, si queremos concatenar los dos ficheros anteriores en un nuevo fichero llamado prueba3 bastaría con ejecutar lo siguiente:
Si queremos añadir al final de un fichero el contenido de otro:
En Linux, los caracteres > y >> se utilizan para redirigir la salida de un comando a un archivo, pero con una diferencia clave en su comportamiento:
1. > (Redirección estándar)
Sobrescribe el contenido del archivo.
Si el archivo no existe, lo crea.
Si el archivo existe, lo borra y escribe el nuevo contenido.
⚠️ ¡Cuidado!
Si usas > sobre un archivo existente, pierdes su contenido anterior.
2. >> (Redirección con anexado)
Añade el contenido al final del archivo (sin borrar lo anterior).
Si el archivo no existe, lo crea.
more
Una orden alternativa a cat es la orden more que da más control que la anterior, ya que automáticamente lista un fichero y cuando llena la terminal (lista tantas líneas como el tamaño de la terminal) se para, esperando que pulsemos una tecla (intro para continuar mostrando el contenido del fichero línea a línea o el espacio mostrar el contenido hasta que se vuelva a llenar de nuevo la terminal).
more [ opciones] nombre_del_fichero
La orden more tiene varias opciones interesantes:
• Con la opción -n, lista el fichero presentando de n en n líneas y no con el número de líneas que posee nuestra pantalla.
• Con el modificador +n, lista el fichero a partir de la línea n
tail
La orden tail permite visualizar el final de un fichero (por defecto 10 líneas). El formato de este comando es:
tail [-numlineas] nombrefichero
La opción -f del comando tail es increíblemente útil porque te permite seguir los cambios en los archivos en tiempo real. Imagina que tienes un archivo que se está actualizando constantemente, como un archivo de registro (log) de un sistema o una aplicación; con tail -f, no solo verás las últimas líneas existentes, sino que el comando permanecerá activo y mostrará automáticamente cualquier nueva línea que se añada al archivo a medida que suceda. Esto es especialmente práctico para monitorizar la actividad en vivo, diagnosticar problemas o simplemente ver cómo crece un archivo sin tener que abrirlo y cerrarlo repetidamente.
Gestión de Archivos: copia, movimiento y renombrado de ficheros.
cp (Copiar)
Si queremos copiar un fichero utilizamos el mandato cp. Por ejemplo, para copiar el fichero llamado “fichero” al directorio dir1, con el mismo nombre:
Archivos: cp origen destino.
Para copiar el fichero llamado “fichero” al directorio dir1 y llamarlo fich, en vez del nombre que tiene actualmente:
La orden cp también copia directorios. Para esto utilizamos el modificador recursivo –R . Por ejemplo,si queremos copia el directorio dir1 (y todo su contenido) al directorio2
Directorios: cp -R dir1 dir2 (copia recursiva)
mv (Mover/Renombrar)
El cometido de la orden mv es mover ficheros entre diferentes directorios. Si se usa sobre el mismo directorio el efecto obtenido consiste en cambiar el nombre al fichero. Por ejemplo, cambiamos el nombre del fichero “prueba” por “pruebilla”:
Para mover el fichero “pruebilla” al directorio dir1:
Los permisos del fichero copiado o movido son los mismos que los del fichero original
rm (Eliminar) ⚠️ ¡Mucho cuidado con este comando!
La orden rm suprime un fichero de un directorio o un directorio completo. Con la opción –R borra un directorio con todo su contenido. ¡Ojo! Esta orden es muy peligrosa, utilízala con precaución. Para borrar un fichero:
Para borrar un directorio este tiene que estar vacío o utilizamos la opción -R si queremos borrar el directorio y todo lo que tiene dentro:
Otras Órdenes Útiles para trabajar con ficheros.
sort
Ordena la información de un fichero. Esta orden la podemos utilizar con diferentes formatos:
sort nombre_fichero - muestra el contenido del fichero ordenado
sort -o fich1 fich2 - mete en fich1 el contenido del fich2 ordenado
wc (Contar)
Sirve para contar líneas, palabras y bytes de un fichero.
Muestra esta información de la siguiente forma:
numero de líneas numero de palabras numero de bytes nombre del fichero
wc [opciones] nombrefichero
Opciones de esta orden:
-c - solo muestra el número de bytes
-l - solo muestra el número de líneas
-w - solo muestra el número de palabras
split
El mandato split divide un fichero de texto en partes. La sintaxis es de la forma:
split [-líneas] nombre [prefijo]
División por defecto: el prefijo por defecto es x, y el número de líneas 1000 (crea ficheros xaa, xab, xac, xad... con 1000 líneas cada uno).
Si dividimos nuestro fichero llamado “fichero” en ficheros de 3 líneas, se crean 7 ficheros
cut (recortar)
El mandato cut recorta columnas o campos de un fichero.
La sintaxis en este caso es como sigue:
cut [opciones] nombre
Las opciones pueden ser:
Cortando columnas. Opción -c
Cortando campos (por defecto, cut asume que los campos se encuentran separados por tabuladores). Opción –f
Indicar de forma explícita el carácter usado como separador entre campos. Opción –d
En este ejemplo vemos como se cogen de cada línea del fichero los caracteres que están en la columna 2 y en la 7.
En el ejemplo anterior los datos han sido separados por tabuladores. Al usar la orden cut -f le hemos dicho que recorte de cada fila los datos que estén antes de la primera, segunda y cuarta tabulación.
En este último ejemplo le he pedido que utilizando como separador el espacio en blanco " " que recorte lo que este antes del primer y tercer separador.
grep (Buscar)
El mandato grep permite realizar búsquedas de líneas que contengan texto que identifique a un objetivo o patrón que se especifica. Se pueden utilizar para extraer información de los archivos, buscar líneas que se relacionen con un elemento particular y para localizar archivos que contengan una palabra clave particular. La forma general del mandato es la siguiente:
grep [opciones] expresión [fichero]
Si se quiere buscar más de una palabra (una frase) separadas por espacios en blanco, o se utilizan caracteres comodín, es necesario encerrar la expresión entre comillas.
Algunas de las opciones de este mandato son:
-i La búsqueda no es sensible a mayúsculas/minúsculas
-n Muestra el número de línea donde se ha encontrado la coincidencia y también la línea.
-l Muestra los nombres de los ficheros, pero no las líneas.
-v Muestran las líneas donde no se produce la coincidencia.
Enlaces.
Aunque los enlaces duros y blandos los vimos en el post anterior merece la pena volver a repasarlos.
El comando ln sirve para crear enlaces.
ln -s f1 simbo1f1 crea un enlace bando (simbólico) llamado simbo1f1 al fichero f1.
Recuerda que los enlaces simbólicos son como los accesos directos en Windows.
ln f1 enla1f1 crea un enlace duro llamado enla1f1 al fichero f1. Los enlaces duros son como diferentes nombres para un mismo archivo. (no valen para directorios)
Conclusión
Estos comandos son esenciales para trabajar en Ubuntu o cualquier distribución Linux. Practícalos en la terminal para familiarizarte con ellos.
Modulo datetime - trabajar con funciones relacionadas con la fecha y hora.
Creando objetos date.
El módulo datetime nos proporciona clases para trabajar con la fecha y hora.
¿Cómo podemos obtener la fecha local y crear objetos del tipo fecha?
Una de las clases proporcionadas por el módulo datetime es una clase llamada date. Los objetos de esta clase representan una fecha que consta de año, mes y día.
La clase date del módulo datetime.
Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> fromdatetimeimportdate
>>> hoy = date.today()
>>> print(hoy)
2024-03-20
>>> print(hoy.year)
2024
>>> print(hoy.month)
3
>>> print(hoy.day)
20
El método today nos devuelve un objeto del tipo date que representa la fecha local actual. Este objeto tiene tres atributos:
.year (año)
.month(mes)
.day(día)
¡Ten cuidado porque estos tres atributos son solo de lectura! Para crear un objeto date debes pasar los atributos de año, mes y dia de la siguiente manera.
>>> from datetime import date
>>> mi_fecha = date(2018, 8, 1)
>>> print(mi_fecha)
2018-08-01
Al crear un objeto date hay que tener en cuenta una serie de restricciones que son lógicas:
Parámetro
Restricciones
year
El parámetro year debe ser mayor o igual a 1 (constante MINYEAR) y menor o igual a 9999 (constante MAXYEAR).
month
El parámetro month debe ser mayor o igual a 1 y menor o igual a 12.
day
El parámetro day debe ser mayor o igual a 1 y menor o igual que el último día del mes y año indicados.
Creación de un objeto de fecha a partir de una marca de tiempo.
La clase date nos permite crear un objeto de fecha a partir de una marca de tiempo utilizando el método fromtimestamp.
En Unix una marca de tiempo es la cantidad de segundos transcurridos desde el 01 de Enero de 1970 a las 00:00:00 (UTC)
Para poder hacer esto, podemos usar el módulo time y a su vez el métodotime. Python nos proporcionará la marca de tiempo actual. Un ejemplo:
La marca de tiempo con time en Unix.
Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import date
>>> import time
>>> marca_tiempo = time.time()
>>> print(f"la marca de tiempo es igual a {marca_tiempo}")
la marca de tiempo es igual a 1710949396.5617826
>>> d = date.fromtimestamp(marca_tiempo)
>>> print("Fecha: ", d)
Fecha: 2024-03-20
Creación de un objeto de fecha usando el formato ISO
Como se usa mucho vamos a ver como representar una fecha usando el standar ISO 8601. Es el típico formato de AAAA-MM-DD. Uno de los métodos que podemos utilizar es fromisoformat. Los parámetros de este método son una cadena.Cuando sustituyas la fecha, asegúrate de agregar 0 antes de un mes o de un día expresado por un número menor que 10.
fecha en formato ISO
# Ejemplo de programa que construye un objeto date
# desde una cadena que contiene una fecha en formato ISO YYYY-MM-DD
from datetime import date
# cumpleaños de Leonardo da vinci
cumple_leo = "1452-04-15"
# Construimos el objeto date
leo_date = date.fromisoformat(cumple_leo)
print(f"El cumpleaños de Leonardo da Vinci es {leo_date}")
print(type(leo_date))
SALIDA:
El cumpleaños de Leonardo da Vinci es 1452-04-15
<class 'datetime.date'>
El método replace()
Si tenemos que reemplazar el año, mes o día de un objeto que ya hayamos creado, no podremos hacerlo a través de los atributos pues son de solo lectura. Para ello utilizaremos el método llamado replace.
método replace
from datetime import date
d = date(2021, 12, 5)
print(d)
d = d.replace(year=2022, month=11, day=4)
print(d)
SALIDA:
2021-12-05
2022-11-04
Los parámetros year, month o day son opcionales. Puedes pasar solo un parámetro a replace si quieres. No obstante recuerda que este método devuelve un objeto date modificado por lo que recuerda asignarlo a alguna variable.
¿Que día de la semana es?
Uno de los métodos mas útiles que facilita el trabajo con fechas es weekday. Devuelve el día de la semana como un número entero, donde 0 es el Lunes y 6 es el Domingo.
método weekday
from datetime import date
d = date(2003,3,14)
print(d.weekday())
SALIDA:
4
La clase date también tiene un método similar llamado isoweekday que también devuelve el día de la semana como un número entero pero 1 es Lunes y 7 Domingo.
método isoweekday
from datetime import date
d = date(2003,3,14)
print(d.weekday())
SALIDA:
5
Como puedes ver para la misma fecha obtenemos un entero diferente, pero que expresa el mismo día de la semana. El entero devuelto por isoweekday sigue la especificación ISO 85601.
Creando objetos Time.
El módulo datetime también tiene una clase que nos permite representar la hora, es la clase time.
El constructor de la clase time, acepta los siguientes parámetros opcionales:
- hour - El párametro hour debe ser mayor o igual que 0 y menor que 23.
- minute-El párametro minute debe ser mayor o igual que 0 y menor que 59.
- second -El párametro second debe ser mayor o igual que 0 y menor que 59.
- microsecond- El párametro microsecond debe ser mayor o igual que 0 y menor que 1000000.
- tzinfo- El párametro tzinfo debe ser un objeto de la subclase tzinfo o None (por defecto).
- fold - El párametro fold debe ser 0 o 1 (predeterminadamente 0).
En la práctica si queremos construir un objeto de tiempo lo haremos de la siguiente manera:
clase time
from datetime import time
t = time(20,1,20,1)
print("Tiempo:", t)
print("Hora:", t.hour)
print("Minutos:", t.minute)
print("Segundos:", t.second)
print("Microsegundo:", t.microsecond)
SALIDA:
Tiempo: 20:01:20.000001
Hora: 20
Minutos: 1
Segundos: 20
Microsegundo: 1
El módulo time.
Además de la clase time del modulo datetime, la biblioteca estandar de python tiene tambien otra módulo llamado time que nos proporciona funciones relacionadas con el tiempo. De este módulo ya vimos la función time() que nos proporciono una marca de tiempo de UNIX. Ahora vamos a ver otra función útil de este módulo como es sleep().
Se utiliza para parar la ejecución de un programa por un periodo de tiempo especificado. Puede ser útil en situaciones como:
1.- Controlar la velocidad de ejecución. Si estás realizando operaciones intensivas en un bucle o en una sección de código y deseas limitar la velocidad a la que se ejecutan esas operaciones, puedes usar sleep() para agregar una pausa entre iteraciones.
sleep del módulo time
import time
for i in range(5):
# Realizamos alguna tarea
print(i)
# Realizamos una pausa de 1 segundo entre class
# las iteraciones.
time.sleep(1)
2.- Sincronización de procesos: En aplicaciones donde múltiples procesos o hilos trabajan simultáneamente y necesitan sincronizarse, sleep() puede utilizarse para introducir una pausa controlada entre las operaciones de diferentes partes del código.
import threading
def proceso():
print("Inicio del proceso")
# Realizar algunas operaciones
time.sleep(2)
print("Fin del proceso")
thread = threading.Thread(target=proceso)
thread.start()
# Realizar otras operaciones mientras el hilo está en ejecución
print("Hilo principal realizando otras operaciones")
3.- Simulación de procesos en tiempo real: En casos donde se necesite simular la espera por eventos externos o procesos en tiempo real, sleep() puede ser útil para hacer pausas en la ejecución del programa.
import time
while True:
# Realizar alguna tarea
print("Esperando por un evento...")
# Esperar 5 segundos antes de verificar nuevamente
time.sleep(5)
Es importante tener en cuenta que sleep() suspende la ejecución del programa actual durante el tiempo especificado, por lo que puede bloquear otros procesos en el mismo hilo. En aplicaciones que requieren concurrencia, es posible que se prefiera el uso de asyncio.sleep() en lugar de time.sleep() para evitar bloqueos en programas asíncronos.
La función ctime.
El módulo time proporciona una función llamada ctime, que convierte el tiempo en segundos desde el 1 de enero de 1970. (marca de tiempo UNIX)
import time
t = time.time()
print(t)
print(time.ctime(t))
SALIDA:
1711144768.1780117
Fri Mar 22 21:59:28 2024
La función ctimedevuelve una cadena para la marca de tiempo pasada. En nuestro ejemplo, la marca de tiempo expresa el 22 de marzo de 2024 a las 21:59:28.
También es posible llamar a la funciónctimesin especificar el tiempo en segundos. En este caso, se devolverá la hora actual.
Las funciones gmtime() y localtime()
Algunas de las funciones disponibles en el modulo time requieren conocer la clase struct_time. Vamos a empezar viendo como es esta clase:
time.struct_time:
tm_year# Especifica el año.
tm_mon# Especifica el mes (valor de 1 a 12)
tm_mday# Especifica el día del mes (value from 1 to 31)
tm_hour# Especifica la hora (valor de 0 a 23)
tm_min# Especifica el minuto (valor de 0 a 59)
tm_sec# Especifica el segundo (valor de 0 a 61)
tm_wday# Especifica el día de la semana (valor de 0 a 6)
tm_yday# Especifica el día del año (valor de 1 a 366)
tm_isdst# Especifica si se aplica el horario de verano (1: sí, 0: no, -1: no se sabe)
tm_zone# Especifica el nombre de la zona horaria (valor en forma abreviada)
tm_gmtoff# Especifica el desplazamiento al este del UTC (valor en segundos)
La clase struct_time también permite el acceso a valores usando índices. El índice 0 devuelve el valor en tm_year, mientras que 8 devuelve el valor en tm_isdst.
Las excepciones son tm_zone y tm_gmoff, a las que no se puede acceder mediante índices. Veamos cómo usar la clase struct_time en la práctica. Ejecuta el código en el editor.
El ejemplo muestra dos funciones que convierten el tiempo transcurrido desde la época Unix al objeto struct_time. La diferencia entre ellos es que la función gmtime devuelve el objeto struct_time en UTC, mientras que la función localtime devuelve la hora local. Para la función gmtime, el atributo tm_isdst es siempre 0.
Las funciones asctime() y mktime().
El módulo time tiene funciones que esperan un objeto struct_time o una tupla que almacena valores de acuerdo con los índices presentados cuando se habla de la clase struct_time. Ejecuta el siguiente código:
La primera de las funciones, llamada asctime, convierte un objetostruct_timeo una tupla en una cadena. Toma en cuenta que la conocida funcióngmtimese usa para obtener el objetostruct_time. Si no se proporciona un argumento a la funciónasctime, se utilizará el tiempo devuelto por la funciónlocaltime.
La segunda función llamadamktimeconvierte un objetostruct_timeo una tupla que expresa la hora local al número de segundos desde la época de Unix.
Creando objetos datetime.
En el módulo datetime, la fecha y la hora se pueden representar como objetos separados o como un solo objeto. La clase que combina fecha y hora se llama datetime.
Vamos a ver como podemos crear un objeto del tipo datetime.
import datetime
fh = datetime.datetime(2024,3,25, 0, 9 , 30)
print(f"la fecha y hora son: {fh}")
print(f"La fecha es: {fh.date()}")
print(f"La hora es: {fh.time()}")
Salida:
la fecha y hora son: 2024-03-25 00:09:30
La fecha es: 2024-03-25
La hora es: 00:09:30
El ejemplo crea un objeto datetime que representa el 25 de marzo de 2024 a las 00:09:30. Todos los parámetros pasados al constructor van a ser atributos de clase de solo lectura. Son year, month, day, hour, minute, second, microsecond, tzinfo, y fold.
El ejemplo muestra dos métodos que devuelven dos objetos diferentes. El método llamado date devuelve el objeto date con el año, mes y día dados, mientras que el método llamado time devuelve el objeto time con la hora y minuto dados.
Métodos que devuelven la fecha y hora actual.
La clase datetimetiene varios métodos que devuelven la fecha y hora actuales. Estos métodos son:
today(): devuelve la fecha y hora local actual con el atributo tzinfo establecido a None.
now(): devuelve la fecha y hora local actual igual que el método today, a menos que le pasemos el argumento opcional tz. El argumento de este método debe ser un objeto de la subclase tzinfo.
utcnow(): devuelve la fecha y hora UTC actual con el atributo tzinfo establecido a None.
Veámoslo con un ejemplo.
from datetime import datetime
print("hoy:", datetime.today())
print("ahora:", datetime.now())
print("utc_ahora:", datetime.utcnow())
Salida:
hoy: 2024-03-25 00:18:09.327818
ahora: 2024-03-25 00:18:09.328024
utc_ahora: 2024-03-24 23:18:09.328138
Obteniendo una marca de tiempo.
Para obtener una marca de tiempo a partir de una fecha en concreto podemos utilizar el método timestamp del módulo datetime.
El método timestamp devuelve un valor flotante que expresa el número de segundos transcurridos entre la fecha y la hora indicadas por el objeto datetime y el 1 de enero de 1970, 00:00:00 (UTC).
Dando formato a la fecha y a la hora.
Todas las clases que hemos visto hasta ahora del modulo datetime tienen un método llamado strftime, el cual nos permite devolver la fecha y la hora en el formato que le especifiquemos.
El método strftime toma solo un argumento en forma de cadena que especifica un formato que puede constar de directivas.
Una directiva es una cadena que consta del caracter % (porcentaje) y una letra minúscula o mayuscula. Por ejemplo la directiva %Y significa el año con el siglo como número decimal. Vamos a verlo con un ejemplo.
from datetime import date
d = date(2023,3,25)
print(d.strftime('%d/%m/%Y'))
SALIDA:
25/03/2023
En el ejemplo hemos pasado un formato que consta de tres directivas separadas por una barra diagonal (/) al método strftime. El separador se puede reemplazar por otro caracter, o incluso por una cadena.
Puede poner cualquier caracter en el formato pero solo las directivas reconocibles se sustituirán por sus correspondiente valores. Puede encontrar todas las directivas disponibles aquí.
El formato de hora funciona de la misma forma que el formato de fecha pero con las directivas adecuadas. Por ejemplo:
from datetime import time
t = time(0,7,30)
print(t.strftime('%H:%M:%S'))
SALIDA:
00:07:30
La función strftime() en el módulo time.
La función strftime() también está presente en el módulo time. No se diferencia mucho del disponible en el modulo datetime.
import time
timestamp = 1572879180
st = time.gmtime(timestamp)
print(time.strftime("%Y/%m/%d %H:%M:%S", st))
print(time.strftime("%Y/%m/%d %H:%M:%S"))
SALIDA
2019/11/04 14:53:00
2024/03/26 22:11:28
Puedes encontrar todas las directivas del módulo time aquí.
El método strptime().
A diferencia del método anterior strftime, crea un objeto datetime a partir de una cadena que representa una fecha y una hora.
El método strptime requiere que especifiques el formato en el que guardaste la fecha y la hora. Veámoslo con un ejemplo.
from datetime import datetime
print(datetime.strptime("2024/03/26 23:17:00", "%Y/%m/%d %H:%M:%S"))
SALIDA
2024-03-26 23:17:00
Hay que tener cuidado dado que si el formato que se especifica no coincide con la cadena se generará un ValueError.
Operaciones con la fecha y la hora.
Para realizar cálculos con la fecha y la hora existe una clase llamada timedelta. Un objeto timedelta se crea cuando se crea una operación con los objetos date o datetime.
Ya hemos visto que un objeto TimeDelta puede devolverse como resultado de restar dos objetos date o datetime. Pero también podemos crear un objeto TimeDelta nosotros mismos. Para ello vamos a familiarizarnos con los argumentos aceptados por el constructor de la clase que son:
days
seconds
microseconds
milliseconds
minutes
hours
weeks
Cada uno es opcional y el valor predeterminado es cero.
Los argumentos deben ser números enteros o de coma flotante, positivos o negativos.
from datetime import timedelta
delta = timedelta(weeks=2, days=2, hours=3)
print(delta)
Salida:
16 days, 3:00:00
El resultado de 16 días se obtiene convirtiendo el argumento weeks en días (2 semanas = 14 días) y agregando el argumento days (2 días). Este es un comportamiento normal, porque el objeto timedelta solo almacena días, segundos y microsegundos internamente. De manera similar, el argumento hora se convierte en minutos. Echa un vistazo al siguiente ejemplo:
El resultado de 10800 se obtiene convirtiendo 3 horas en segundos. De esta forma el objeto timedeltaalmacena los argumentos pasados durante su creación. Las semanas se convierten en días, las horas y los minutos en segundos y los milisegundos en microsegundos.
Ya sabes cómo el objetotimedeltaalmacena los argumentos pasados internamente. Veamos cómo se puede utilizar en la práctica.
Observa algunas operaciones admitidas por las clases del módulodatetime. Observa el siguiente código:
1.- En el módulo calendar los días de la semana se muestran de lunes a domingo. Cada día de la semana tiene su representación en forma de número entero, donde el primer día de la semana, el lunes, está representado por el valor 0, mientras que el último día de la semana, el domingo, está representado por el valor 6.
2.- Para mostrar un calendario de cualquier año, se emplea la función calendar, pasándole el año como argumento. Por ejemplo:
import calendar
print(calendar.calendar(2024))
Salida:
2024
January February March
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 7 1 2 3 4 1 2 3
8 9 10 11 12 13 14 5 6 7 8 9 10 11 4 5 6 7 8 9 10
15 16 17 18 19 20 21 12 13 14 15 16 17 18 11 12 13 14 15 16 17
22 23 24 25 26 27 28 19 20 21 22 23 24 25 18 19 20 21 22 23 24
29 30 31 26 27 28 29 25 26 27 28 29 30 31
April May June
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 7 1 2 3 4 5 1 2
8 9 10 11 12 13 14 6 7 8 9 10 11 12 3 4 5 6 7 8 9
15 16 17 18 19 20 21 13 14 15 16 17 18 19 10 11 12 13 14 15 16
22 23 24 25 26 27 28 20 21 22 23 24 25 26 17 18 19 20 21 22 23
29 30 27 28 29 30 31 24 25 26 27 28 29 30
July August September
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 7 1 2 3 4 1
8 9 10 11 12 13 14 5 6 7 8 9 10 11 2 3 4 5 6 7 8
15 16 17 18 19 20 21 12 13 14 15 16 17 18 9 10 11 12 13 14 15
22 23 24 25 26 27 28 19 20 21 22 23 24 25 16 17 18 19 20 21 22
29 30 31 26 27 28 29 30 31 23 24 25 26 27 28 29
30
October November December
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 1 2 3 1
7 8 9 10 11 12 13 4 5 6 7 8 9 10 2 3 4 5 6 7 8
14 15 16 17 18 19 20 11 12 13 14 15 16 17 9 10 11 12 13 14 15
21 22 23 24 25 26 27 18 19 20 21 22 23 24 16 17 18 19 20 21 22
28 29 30 31 25 26 27 28 29 30 23 24 25 26 27 28 29
30 31
Como alternativa a lo anterior, podemos utilizar la función prcal (calendar.prcal(año), que toma los mismo parámetros que la función calendar, pero no requiere el uso de print para imprimir el formulario.
3.- Para mostrar el calendario de cualquier mes del año, se emplea la función month pasándole el año y el mes. Por ejemplo:
import calendar
print(calendar.month(2024, 3))
Salida:
March 2024
Mo Tu We Th Fr Sa Su
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
O también puedes usar la función prmonth.
4.- La función setfirstweekdayte permite cambiar el primer día de la semana. Toma un valor de 0 a 6 donde el 0 es el Lunes y 6 es el Domingo.
Por ejemplo si queremos que la semana empieze el Domingo utilizaremos el siguiente código:
import calendar
calendar.setfirstweekday(6)
# también se puede utilizar calendar.DIASEMANA
# calendar.setfirstweekday(calendar.SUNDAY)
calendar.prmonth(2024, 3)
Salida:
March 2024
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
5.- La función weekday es el día de la semana para un año, mes y día determinado pasado por argumento.
Por ejemplo para saber que día de la semana nació Leonardo Da Vinci (15.04.1542)
6.- La función weekheader devuelve los nombres de los días de la semana en forma abreviada. Se requiere que se pase como argumento el ancho en caracteres de un día de la semana.
M T W T F S S
Mon Tue Wed Thu Fri Sat Sun
Mon Tue Wed Thu Fri Sat Sun
Monday Tuesday Wednesday Thursday Friday Saturday Sunday
7.- Una función útil es isleap, que nos permite saber si un año es bisiesto o no.
import calendar
print(calendar.isleap(2024))
Salida:
True
8.- Podemos crear un objeto calendar usando la clase Calendar, que al crear el objeto te permite cambiar el primer día de la semana con el parámetro opcional firstweekday, por ejemplo:
import calendar
c = calendar.Calendar(2)
for weekday in c.iterweekdays():
print(weekday, end=" ")
Salida:
2 3 4 5 6 0 1
iterweekdays devuelve un iterador para los números de los días de la semana. El primer valor devuelto siempre es igual al valor de la propiedad firstweekday.