7# CURSO python3
...
Archivo ejecutable
chmod +x nombre-del-archivo
Lenguaje interpretado Interprete en la primera linea , ejemplos:
#!/usr/bin/env python
#!/usr/bin/env python2
#!/usr/bin/env python3
#!/usr/bin/env bash
Ejemplo script:
#!/usr/bin/env python3
print("Hola Mundo!")
...
#!/usr/bin/env python3
nombre_de_la_variable = valor_de_la_variable
#!/usr/bin/env python3
variable = 12
#!/usr/bin/env python3
mi_variable = 15
print(mi_variable)
#!/usr/bin/env python3
mi_variable = input("Ingresa un valor: ")
print(mi_variable)
Cadena de texto (string):
#!/usr/bin/env python3
mi_cadena = "Hola mundo!"
otra_cadena = 'Hola mundo!'
#!/usr/bin/env python3
mi_cadena_multilinea = """
Esta es una Cadena
de varias lineas
"""
Numero entero:
#!/usr/bin/env python3
edad = 25
Numero real:
#!/usr/bin/env python3
precio = 35.05
Booleano(verdadero/falso):
#!/usr/bin/env python3
verdadero = True
falso = False
Suma
#!/usr/bin/env python3
a = 10 + 5
Resta
#!/usr/bin/env python3
a = 12 - 7
Negacion
#!/usr/bin/env python3
a = -5
Multiplicacion
#!/usr/bin/env python3
a = 7 * 5
Exponente
#!/usr/bin/env python3
a = 2 ** 3
Division
#!/usr/bin/env python3
a = 12.5 / 2
Division entera
#!/usr/bin/env python3
a = 12.5 // 2
Modulo
#!/usr/bin/env python3
a = 27 % 4
Comentario en una sola linea
#!/usr/bin/env python3
# Comentario en una linea
Comentario de varias lineas
#!/usr/bin/env python3
"""Y esto es un comentario
de varias lineas"""
Comentario en lineas
#!/usr/bin/env python3
mi_variable = 15 # comentario en linea
Esta declaracion es opcional desde la version 3.0 :
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
variable = "En el mundo Ñagara encontré un Ñandú"
Tupla es una variable que permite almacenar datos inmutables
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
mi_tupla = ('cadena de texto', 15, 2.8, 'otro dato', 25)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
print(mi_tupla[1]) # Salida: 15
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
print(mi_tupla[1:4]) # Devuelve: (15, 2.8, 'otro dato')
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
print(mi_tupla[3:]) # Devuelve: ('otro dato', 25)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
print(mi_tupla[:2]) # Devuelve: ('cadena de texto', 15)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
print(mi_tupla[-1]) # Salida: 25
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
print(mi_tupla[-2]) # Salida: otro dato
Lista es similar a la tupla , solo que en la lista , SI esta permitido modificar datos
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
mi_lista = ['cadena de texto', 15, 2.8, 'otro dato', 25]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
print(mi_lista[1]) # Salida: 15
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
print(mi_lista[1:4]) # Devuelve: [15, 2.8, 'otro dato']
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
print(mi_lista[-2]) # Salida: otro dato
Los datos de una lista , NO son inmutables , pero SI modificables , una vez creados
Declarar nuevo valor , posicion 2:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
mi_lista[2] = 3.8
print(mi_lista[2]) # Salida: 3.8 , el tercer elemento ahora es 3.8
Tambien se permiten añadir nuevos datos a las listas:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
mi_lista.append('Nuevo Dato')
print(mi_lista) # Salida: 'cadena de texto', 15, 2.8, 'otro dato', 25, 'Nuevo Dato'
Los Diccionarios , como las tuplas y listas , son colecciones. En un diccionario , la posicion del dato se asocia a un valor.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
mi_diccionario = {
'clave_1': valor_1,
'clave_2': valor_2,
'clave_7': valor_7
}
print(mi_diccionario['clave_2']) # Salida: valor_2
Borrar cualquier entrada de un diccionario:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
del(mi_diccionario['clave_2'])
Modificar valores en diccionario , como en las listas:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
mi_diccionario['clave_1'] = 'Nuevo valor'
Agregar mas elementos al diccionario , con mas valores en sus claves:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
mi_diccionario['nueva_clave'] = 'Nuevo elemento'
Como agrupar instrucciones de forma controlada
- Estructuras de control condicionales
- Estructuras de control iterativas
Sangrado en python es obligatorio.
Sangrado 4 espacios en blanco , indicara que las instrucciones forman parte de una misma estructura de control
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
inicio de la estructura de control:
expresiones
Las condiciones se evaluan como verdaderas o falsas.
- se utilizan operadores relacionales o de comparacion
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'==' igual que
'!=' distinto que
'<' menor que
'>' mayor que
'<=' menor o igual que
'>=' mayor o igual que
- operadores logicos
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
and (y)
5 == 7 and 7 < 12 0y0 falso
9 < 12 and 12 > 7 1y1 verdadero
9 < 12 and 12 > 15 1y0 falso
or (o)
12 == 12 or 15 < 7 1o0 verdadero
7 > 5 or 9 < 12 1o1 verdadero
Definicion estructura de control de flujo condicional:
if (si) , elif (sino, si) , else (sino)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
if gasto <= 100:
pagar_en_efectivo()
elif gasto > 100 and gasto < 300:
pagar_con_debito()
else:
pagar_con_credito()
Python dispone de 2 estructuras de control iterativas:
- bucle while
- bucle for
mientras que una condicion se cumpla se encarga de ejecutar una misma accion:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
year = 2016
while year <= 2022:
print("Informes de", year)
year +=1
Informes de 2016
Informes de 2017
Informes de 2018
Informes de 2019
Informes de 2020
Informes de 2021
Informes de 2022
Instruccion break:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
while True:
nombre = raw_input("Indique su nombre: ")
if nombre:
break
En caso de que la variable sea verdadera , break se ejecutara.
El bucle siempre se utiliza sobre una tupla o una lista.
Por cada elemento de la lista se ejecutaran mismas acciones:
En cada elemento mi_lista , imprimir el elemento:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
mi_lista = ['Juan', 'Antonio', 'Pedro', 'Ana']
for elemento in mi_lista:
print(elemento)
En cada elemento mi_tupla , imprimir color:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
mi_tupla = ['rosa', 'verde', 'celeste', 'amarillo']
for color in mi_tupla:
print(color)
Emular a while:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
for year in range(2011, 2023):
print("Informes de", year)
Una Funcion alberga expresiones y algoritmos que son ejecutados cuando se invoca una funciona ya definida.
El propio lenguaje de Python contiene funciones incorporadas , pero el usuario tambien puede definir nuevas.
En Python para definir funciones se utiliza la instruccion 'def' mas un nombre de la funcion.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def mi_funcion():
print("Hola") # aqui el algoritmo identado
Una funcion no funciona hasta que no es invocada:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def mi_funcion():
return "Hola" # aqui el algoritmo identado
mi_funcion()
El valor de una funcion puede almacenarse en una variable:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def mi_funcion():
return "Hola" # aqui el algoritmo identado
palabra = mi_funcion()
El valor de una funcion puede imprimirse en una variable:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def mi_funcion():
return "Hola" # aqui el algoritmo identado
palabra = mi_funcion()
print(palabra)
El valor de una funcion puede ignorarse en una variable:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def mi_funcion():
return "Hola" # aqui el algoritmo identado
mi_funcion()
un parametro es un valor de la funcion , se definen entre los parentesis y separados por coma.
instruccion 'pass' se utiliza para completar una estructura de control que no realiza ninguna accion.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def mi_funcion(param1, param2):
pass
Los parametros de una funcion seran utilizados dentro de su algoritmos
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def mi_funcion(patatas, tomates):
sumadevegetables = patatas + tomates
return sumadevegetables
mi_funcion(5, 5)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def mi_funcion(patatas, tomates):
sumadevegetables = patatas + tomates
print(sumadevegetables)
mi_funcion(5, 5)
Es posible asignar valores estaticos o por defecto a los parametros en las funciones. La definicion de una funcion la deben anteceder dos lineas en blanco. El valor parametro por omision no se debe dejar ningun espacio ni antes ni despues signo '=' El parametro por omision se define SIEMPRE a continuacion de definir primero los obligatorios
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def mi_funcion(patatas, tomates=10):
sumadevegetables = patatas + tomates
print(sumadevegetables)
mi_funcion(5)
las claves como argumentos , Python permite llamar a una funcion pasandole argumentos esperados como pares claves=valor
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def funcion(obligatorio1, opcional='valor por defecto', opcional_dos=15):
pass
funcion('valor obligatorio', opcional_dos=43)
para definir argumentos arbitrarios en una funcion , se antecede un asterisco * los argumentos arbitrarios preceden(van despues) de los obligatorios
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def funcion(obligatorio, *arbitrarios):
pass
funcion('fijo', 1, 2, 3, 4, 5)
funcion('fijo', 1, 2)
funcion('fijo', 1, 2, 3, 4, 5, 6, 7)
funcion('fijo')
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def funcion(*arbitrarios):
for argumento in arbitrarios:
valor = arbitrarios[argumento]
print(valor)
funcion(1, 2)
es posible definir argumentos arbitrarios como pares de clave=valor , al nombre del parametro deben precederlo dos asteriscos (**):
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def funcion(obligatorio, **arbitrarios):
pass
funcion('fijo', a=1, b=2, c=3)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def funcion(**arbitrarios):
for argumento in arbitrarios:
valor = arbitrarios[argumento]
print(valor)
funcion(a=1, b=2)
Se pueden definir los parametros de la funcion , en forma de lista o de diccionario, y estos pasarlos a la funcion:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def funcion(uno, dos, tres):
pass
# DESEMPAQUETADO DE LISTAS
parametros = [1, 2, 3]
funcion(*parametros)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def funcion(uno, dos, tres):
pass
# DESEMPAQUETADO DE LISTAS
parametros = dict(uno=1, dos=2, tres=3)
funcion(**parametros)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def funcion(uno, dos, tres):
pass
# DESEMPAQUETADO DE LISTAS
parametros = {'uno': 1, 'dos': 2, 'tres': 3}
funcion(**parametros)
Una funcion puede llamar a otro funcion que retorne un valor
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def retornar(algo):
return str(algo)
def llamar():
algo = retornar()
La llamada interna se puede almacenar , retornar o ignorarse
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def almacenar():
algo = retornar()
def volver_a_retornar():
return retornar()
def ignorar():
retornar()
llamada recursiva , es cuando se define la funcion y la llamada que se hace es a la misma funcion.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def get_nombre():
nombre = raw_input("Nombre: ")
if not nombre:
get_nombre()
La finalidad de las funciones , es realizar una unica accion.
Esta puede contener cualquier algoritmo y numero de instrucciones , pero con elf in de realizar una unica accion.
Una variable se inyecta en una cadena de texto , con el fin de que la cadena contenga variables y el valor de las variables sea contenido en la cadena.
Las variables se inyectan en las cadenas de texto mediante modificadores '{}'
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "Cadena preparada para recibir dos datos variables: {} y {}."
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "Cadena preparada para recibir dos datos variables: {dato1} y {dato2}."
La funcion 'format()' es un metodo del objeto string. Metodo son funciones.
Los objetos son variables
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "Cadena preparada para recibir dos datos variables: {} y {}."
resultado = cadena.format(variable1, variable2)
print(resultado)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "Cadena preparada para recibir dos datos variables: {dato1} y {dato2}."
resultado = cadena.format(dato1="variable1", dato2="variable2")
print(resultado)
modulo. En Python un modulo es cualquier archivo o fichero .py
paquete. en python se considera paquete/package a una carpeta que contiene modulos y un archivo/fichero 'init.py' que puede estar o no vacio
- paquete
- "init.py"
- 'modulo1.py'
- 'modulo2.py'
- 'modulo3.py'
Importar un modulo significa incluir el contenido de un archivo dentro de otro.
Se puede importar modulo completo o solo elementos parciales , como variables , funciones etc.
Para importar un moduo completo se utiliza la palabra clave import , mientras que para importar elementos se utiliza la dupla from/import
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import modulo
import paquete.modulo
import paquete.subpaquete.modulo
from modulo import variable
from modulo import variable, funcion
from modulo import *
El asterisco equivale a importar todos los elementos contenidos en un modulo. No es igual que importar todo el modulo.
import modulo # para llamar a 'A' dentro de modulo: modulo.A from modulo import * # para llamar a 'A' dentro de modulo: A
Para acceder a los elementos de un modulo importado a traves del espacio de nombre importado
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import modulosypaquetes.paquete
modulosypaquetes.paquete.modulo.funcion()
import modulosypaquetes.paquete.modulo
modulosypaquetes.paquete.modulo.funcion()
from modulosypaquetes.paquete import modulo
modulo.funcion()
from modulosypaquetes.paquete.modulo import funcion
funcion()
Es posible crear alias cuando importamos , para acceder a los espacios de nombre de forma mas abreviada
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import modulosypaquetes.paquete.modulo as m
m.funcion()
Una variable es un objeto.
Se pueden realizar acciones llamadas metodos en python sobre estos objetos.
Los metodos son funciones que se desprenden de una variable, por eso la sintaxis es:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
variable.funcion()
En algunos casos los metodos, aceptaran parametros como cualquier otra funcion.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
variable.funcion(parametro)
metodos que pueden aplicarse sobre una cadena de texto:
metodo: capitalize()
retorna: copia de la cadena con primera letra en mayuscula
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "bienvenido a mi aplicacion"
resultado = cadena.capitalize()
print(resultado)
metodo: lower()
retorna: una copia de la cadena en minusculas
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "HOla Mundo"
resultado = cadena.lower()
print(resultado) # Salida: hola mundo
metodo: upper()
retorna: una copia de la cadena en mayusculas
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "HOla Mundo"
resultado = cadena.upper()
print(resultado) # Salida: HOLA MUNDO
metodo: swapcase()
retorna: una copia de la cadena convertidas las mayusculas en minusculas y viceversa
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "Hola Mundo"
resultado = cadena.swapcase()
print(resultado) # Salida: hOLA mUNDO
metodo: title()
retorna: una copia de la cadena convertida
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "hola mundo"
resultado = cadena.title()
print(resultado) # Salida: Hola Mundo
metodo: center(longitud[, "caracter de relleno"])
retorna: una copia de la cadena centrada
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "bienvenido a la aplicacion".capitalize()
resultado1 = cadena.center(50, "=")
resultado2 = cadena.center(50, " ")
print(resultado1) # Salida: =====Bienvenido a mi aplicacion=====
print(resultado2) # Salida: Bienvenido a mi aplicacion
metodo: ljust(longtud[, "caracter de relleno"])
retorna: una copia de la cadena alineada a la izquierda
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "bienvenido a la aplicacion".capitalize()
resultado1 = cadena.ljust(50, "=")
print(resultado1) # Salida: Bienvenido a mi aplicacion==========
metodo: rjust(longtud[, "caracter de relleno"])
retorna: una copia de la cadena alineada a la derecha
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "bienvenido a la aplicacion".capitalize()
resultado1 = cadena.rjust(50, "=")
resultado2 = cadena.rjust(50, " ")
print(resultado1) # Salida: ==========Bienvenido a mi aplicacion
print(resultado2) # Salida: Bienvenido a mi aplicacion
metodo: zfill(longitud)
retorna: una copia de la cadena rellena con ceros a la izquierda hasta alcanzar la longitud final indicada
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
numero_factura = 1575
resultado = str(numero_factura).zfill(12)
print(resultado)
metodo: count("subcadena"[,posicion_inicio, posicion_fin])
retorna: un entero representando la cantidad de apariciones de subcadena dentro de cadena
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "bienvenido a mi aplicacion".capitalize()
resultado = cadena.count("a")
print(resultado) # Salida: 3
metodo: find("subcadena"[, posicion_inicio, posicion_fin])
retorna: un entero representando la posicon donde inicia la subcadena dentro de cadena.
Si no la encuentra retorna -1
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "bienvenido a mi aplicacion".capitalize()
resultado = cadena.find("mi")
print(resultado) # Salida: 13 , por que la posicion 13 dentro de la cadena es donde esta 'mi'
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "bienvenido a mi aplicacion".capitalize()
resultado = cadena.find("mi", 0, 10)
print(resultado) # Salida: -1 , por que entre la posicion 0 y 10 dentro de la cadena NO se encuentra 'mi'
metodo: startswith("subcadena"[, posicion_inicio, posicion_fin])
retorna: true o false
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "bienvenido a mi aplicacion".capitalize()
resultado = cadena.startswith("Bienvenido")
print(resultado) # Salida: True
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "bienvenido a mi aplicacion".capitalize()
resultado = cadena.startswith("aplicacion")
print(resultado) # Salida: False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "bienvenido a mi aplicacion".capitalize()
resultado = cadena.startswith("aplicacion", 16)
print(resultado) # Salida: True
metodo: endswith("subcadena"[, posicion_inicio, posicion_fin])
retorna: True o False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "bienvenido a mi aplicacion".capitalize()
resultado = cadena.endswith("aplicacion")
print(resultado) # Salida: True
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "bienvenido a mi aplicacion".capitalize()
resultado = cadena.endswith("Bienvenido")
print(resultado) # Salida: False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "bienvenido a mi aplicacion".capitalize()
resultado = cadena.endswith("Bienvenido", 0, 10)
print(resultado) # Salida: True
metodo: isalnum()
retorna: True o False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "pepegrillo 75"
resultado = cadena.isalnum()
print(resultado) # Salida: False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "pepegrillo"
resultado = cadena.isalnum()
print(resultado) # Salida: True
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "pepegrillo75"
resultado = cadena.isalnum()
print(resultado) # Salida: True
metodo: isalpha()
retorna: True o False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "pepegrillo 75"
resultado = cadena.isalpha()
print(resultado) # Salida: False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "pepegrillo"
resultado = cadena.isalpha()
print(resultado) # Salida: True
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "pepegrillo75"
resultado = cadena.isalpha()
print(resultado) # Salida: False
metodo: isdigit()
retorna: True o False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "pepegrillo 75"
resultado = cadena.isdigit()
print(resultado) # Salida: False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "7584"
resultado = cadena.isdigit()
print(resultado) # Salida: True
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "75 84"
resultado = cadena.isdigit()
print(resultado) # Salida: False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "75.84"
resultado = cadena.isdigit()
print(resultado) # Salida: False
metodo: islower()
retorna: True o False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "pepe grillo"
resultado = cadena.islower()
print(resultado) # Salida: True
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "Pepe Grillo"
resultado = cadena.islower()
print(resultado) # Salida: False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "Pepegrillo"
resultado = cadena.islower()
print(resultado) # Salida: False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "pepegrillo75"
resultado = cadena.islower()
print(resultado) # Salida: True
metodo: isupper()
retorna: True o False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "PEPE GRILLO"
resultado = cadena.isupper()
print(resultado) # Salida: True
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "Pepe Grillo"
resultado = cadena.isupper()
print(resultado) # Salida: False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "Pepegrillo"
resultado = cadena.isupper()
print(resultado) # Salida: False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "PEPEGRILLO"
resultado = cadena.isupper()
print(resultado) # Salida: True
metodo: isspace()
retorna: True o False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "pepe grillo"
resultado = cadena.isspace()
print(resultado) # Salida: False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = " "
resultado = cadena.isspace()
print(resultado) # Salida: True
metodo: istitle()
retorna: True o False
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "Pepe Grillo"
resultado = cadena.istitle()
print(resultado) # Salida: True
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
cadena = "Pepe grillo"
resultado = cadena.istitle()
print(resultado) # Salida: False
metodo: format(*args, **kwargs)
retorna: la cadena formateada
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> cadena = "bienvenido a mi aplicación {0}"
>>> cadena.format("en Python")
bienvenido a mi aplicación en Python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> cadena = "Importe bruto: ${0} + IVA: ${1} = Importe neto: {2}"
>>> cadena.format(100, 21, 121)
Importe bruto: $100 + IVA: $21 = Importe neto: 121
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> cadena = "Importe bruto: ${bruto} + IVA: ${iva} = Importe neto: {neto}"
>>> cadena.format(bruto=100, iva=21, neto=121)
Importe bruto: $100 + IVA: $21 = Importe neto: 121
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> cadena = "Importe bruto: ${bruto} + IVA: ${iva} = Importe neto: {neto}"
>>> cadena.format(bruto=100, iva=21, neto=121)
Importe bruto: $100 + IVA: $21 = Importe neto: 121
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> cadena = "Importe bruto: ${bruto} + IVA: ${iva} = Importe neto: {neto}"
>>> cadena.format(bruto=100, iva=100 * 21 / 100, neto=100 * 21 / 100 + 100)
Importe bruto: $100 + IVA: $21 = Importe neto: 121
metodo: replace("busqueda", "reemplazo")
retorna: la cadena reemplazada
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> buscada = "nombre apellido"
>>> reemplazo = "Juan Pérez"
>>> "Estimado Sr. nombre apellido:".replace(buscada, reemplazo)
Estimado Sr. Juan Pérez:
metodo: strip(["caracter"])
retorna: la cadena sustituida
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> cadena = " www.ejemplo.com "
>>> cadena.strip()
www.ejemplo.com
>>> cadena.strip(' ')
www.ejemplo.com
metodo: lstrip(["caracter"])
retorna: la cadena sustituida
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> cadena = "www.ejemplo.com"
>>> cadena.lstrip("w." )
ejemplo.com
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> cadena = " www.ejemplo.com"
>>> cadena.lstrip()
www.ejemplo.com
metodo: rstrip(["caracter"])
retorna: la cadena sustituida
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> cadena = "www.ejemplo.com "
>>> cadena.rstrip( )
www.ejemplo.com
metodo: join (iterable)
retorna: la cadena unida con el iterable (la cadena es separada por cada uno de los elementos del iterable)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> rellenos = ("Nº 0000-0", "-0000 (ID: ", ")")
>>> numero = "275"
>>> numero_factura = numero.join(rellenos)
>>> numero_factura
Nº 0000-0275-0000 (ID: 275)
metodo: partition("separador")
retorna: una tupla de tres elementos dodne el primero es el contenido de la cadena previo al separador, el segundo , el separador mismo y el tercero, el contenido de la cadena posterios al separador.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> url = "https://www.ejemplo.com"
>>> tupla = url.partition("www.")
>>> tupla
('https://', 'www.', 'ejemplo.com')
>>> protocolo, separador, dominio = tupla
>>>> "Protocolo: {0}\nDominio: {1}".format(protocolo, dominio)
Protocolo: https://
Dominio: ejemplo.com
metodo: split("separador")
retorna: una lista con todos elementos encontrados al dividir la cadena por un separador
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> keywords = "python, guia, curso".split(", ")
>>> keywords
['python', 'guia', 'curso']
metodo: splitlines()
retorna: una lista donde cada elemento es una fraccion de la cadena dividida en lineas
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> texto = """Linea 1
Linea 2
Linea 3
Linea 4
"""
>>> texto.splitlines()
['Linea 1', 'Linea 2', 'Linea 3', 'Linea 4']
>>> texto = "Linea 1\nLinea 2\nlinea 3"
>>> texto.splitlines()
['Linea 1', 'Linea 2', 'Linea 3']
En este capitulo, se veran los metodos que posee el objeto lista. Algunos de ellos , tambien se encuentran disponibles para las tuplas.
metodo: append("nuevo elemento")
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> nombres_masculinos = ["Alvaro", "Jacinto", "Miguel", "Edgardo", "David"]
>>> nombres_masculinos.append("Jose")
>>> nombres_masculinos
['Alvaro', 'David', 'Edgardo', 'Jacinto', 'Jose', 'Ricky', 'Jose']
metodo: extend(otra_lista)
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> nombres_masculinos.extend(["Jose", "Gerardo"])
>>> nombres_masculinos
['Alvaro', 'David', 'Edgardo', 'Jacinto', 'Jose', 'Ricky', 'Jose', 'Jose', 'Gerardo']
metodo: insert(posicion, "nuevo elemento")
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> nombres_masculinos.insert(0, "Ricky")
>>> nombres_masculinos
['Ricky', 'Alvaro', 'David', 'Edgardo', 'Jacinto', 'Jose', 'Ricky', 'Jose', 'Jose', 'Gerardo']
metodo: pop()
retorna: el elemento eliminado
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> nombres_masculinos.pop()
'Gerardo'
>>> nombres_masculinos
['Ricky', 'Alvaro', 'David', 'Edgardo', 'Jacinto', 'Jose', 'Ricky', 'Jose', 'Jose']
metodo: pop(indice)
retorna: el elemento eliminado
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> nombres_masculinos.pop(3)
'Edgardo'
>>> nombres_masculinos
['Ricky', 'Alvaro', 'David', 'Jacinto', 'Jose', 'Ricky', 'Jose', 'Jose']
metodo: remove("valor")
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> nombres_masculinos.remove("Jose")
>>> nombres_masculinos
['Ricky', 'Alvaro', 'David', 'Jacinto', 'Ricky', 'Jose', 'Jose']
metodo: reverse()
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> nombres_masculinos.reverse()
>>> nombres_masculinos
['Jose', 'Jose', 'Ricky', 'Jacinto', 'David', 'Alvaro', 'Ricky']
metodo: sort()
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> nombres_masculinos.sort()
>>> nombres_masculinos
['Alvaro', 'David', 'Jacinto', 'Jose', 'Jose', 'Ricky', 'Ricky']
metodo: sort(reverse=True)
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> nombres_masculinos.sort(reverse=True)
>>> nombres_masculinos
['Ricky', 'Ricky', 'Jose', 'Jose', 'Jacinto', 'David', 'Alvaro']
metodo: count(elemento)
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> nombres_masculinos = ["Alvaro", "Miguel", "Edgardo", "David", "Miguel"]
>>> nombres_masculinos.count("Miguel")
2
metodo: index(elemento[, indice_inicio, indice_fin])
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> nombres_masculinos.index("Miguel")
1
>>> nombres_masculinos.index("Miguel", 2, 5)
4
se pueden convertir listas en tuplas y viceversa
metodo: list(tupla)
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> tupla = (1, 2, 3, 4)
>>> tupla
(1, 2, 3, 4)
>>> list(tupla)
[1, 2, 3, 4]
metodo: tuple(lista)
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> lista = [1, 2, 3, 4]
>>> lista
[1, 2, 3, 4]
>>> tuple(lista)
(1, 2, 3, 4)
se pueden concatenar las listas con las listas y las tuplas con las tuplas
metodo:
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> lista1 = [1, 2, 3, 4]
>>> lista2 = [3, 4, 5, 6, 7, 8]
>>> lista3 = lista1 + lista2
>>> lista3
[1, 2, 3, 4, 3, 4, 5, 6, 7, 8]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> tupla1 = (1, 2, 3, 4, 5)
>>> tupla2 = (4, 6, 8, 10)
>>> tupla3 = (3, 5, 7, 9)
>>> tupla4 = tupla1 + tupla2 + tupla3
>>> tupla4
(1, 2, 3, 4, 5, 4, 6, 8, 10, 3, 5, 7, 9)
obtner valor maximo y minimo de listas o de tuplas
metodo: max() metodo: min()
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> max(tupla4)
10
>>> max(tupla1)
5
>>> min(tupla1)
1
>>> max(lista3)
8
>>> min(lista1)
1
contar elementos de una lista o tupla
metodo: len()
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> len(lista3)
10
>>> len(lista1)
4
metodo: clear()
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> diccionario = {"color": "violeta", "talle": "XS", "precio": 174.25}
>>> diccionario
{"color": "violeta", "precio": 174.25, "talle": "XS"}
>>> diccionario.clear()
>>> diccionario
{}
metodo: copy()
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> diccionario = {"color": "violeta", "talle": "XS", "precio": 174.25}
>>> camiseta = diccionario.copy()
>>> diccionario
{"color": "violeta", "precio": 174.25, "talle": "XS"}
>>> camiseta
{"color": "violeta", "precio": 174.25, "talle": "XS"}
>>> diccionario.clear()
>>> diccionario
{}
>>> camiseta
{"color": "violeta", "precio": 174.25, "talle": "XS"}
>>> musculosa = camiseta
>>> camiseta
{"color": "violeta", "precio": 174.25, "talle": "XS"}
>>> musculosa
{"color": "violeta", "precio": 174.25, "talle": "XS"}
>>> camiseta.clear()
>>> camiseta
{}
>>> musculosa
{}
metodo: dict.fromkeys(secuencia[, valor por defecto])
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> secuencia = ["color", "talle", "marca"]
>>> diccionario1 = dict.fromkeys(secuencia)
>>> diccionario1
{'color': None, 'marca': None, 'talle': None}
>>> diccionario2 = dict.fromkeys(secuencia, 'valor x defecto')
>>> diccionario2
{'color': 'valor x defecto', 'marca': 'valor x defecto', 'talle': 'valor x defecto'}
metodo: update(diccionario)
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> diccionario1 = {"color": "verde", "precio": 45}
>>> diccionario2 = {"talle": "M", "marca": "Lacoste"}
>>> diccionario1.update(diccionario2)
>>> diccionario1
{'color': 'verde', 'precio': 45, 'marca': 'Lacoste', 'talle': 'M'}
metodo: setdefault("clave"[, None|valor_por_defecto])
Si la clave no existe , la crea con el valor por defecto. Siempre retorna el valor para la clave pasada como parámetro.
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> camiseta = {"color": "rosa", "marca": "Zara"}
>>> clave = camiseta.setdefault("talle", "U")
>>> clave
'U'
>>> camiseta
{'color': 'rosa', 'marca': 'Zara', 'talle': 'U'}
>>> camiseta2 = camiseta.copy()
>>> camiseta2
{'color': 'rosa', 'marca': 'Zara', 'talle': 'U'}
>>> clave = camiseta2.setdefault("estampado")
>>> clave
>>> camiseta2
{'color': 'rosa', 'estampado': None, 'marca': 'Zara', 'talle': 'U'}
>>> clave = camiseta2.setdefault("marca", "Lacoste")
>>> clave
'Zara'
>>> camiseta2
{'color': 'rosa', 'estampado': None, 'marca': 'Zara', 'talle': 'U'}
metodo: get(clave[, "valor x defecto si la clave no existe"])
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> camiseta
{'color': 'rosa', 'marca': 'Zara', 'talle': 'U'}
>>> camiseta.get("color")
'rosa'
>>> camiseta.get("stock")
>>> camiseta.get("stock", "sin stock")
'sin stock'
metodo: 'clave' in diccionario
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> camiseta
{'color': 'rosa', 'marca': 'Zara', 'talle': 'U'}
>>> existe = 'precio' in camiseta
>>> existe
False
>>> existe = 'color' in camiseta
>>> existe
True
metodo: items()
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
diccionario = {'color': 'rosa', 'marca': 'Zara', 'talle': 'U'}
for clave, valor in diccionario.items():
clave, valor
Salida:
('color', 'rosa')
('marca', 'Zara')
('talle', 'U')
En Python2 existia iteritems():
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> a = dict(a=1, b=2)
>>> a.iteritems()
En Python3 ya no existe:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> a.iteritems()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute
'iteritems'
Debe emplearse items() para generar código híbrido. no obstante, tener en cuenta que los objetos retornados se verán de forma diferente en ambas versiones. Python3:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> a.items()
dict_items([('a', 1), ('b', 9)])
Python2:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> a.items()
[('a', 1), ('b', 9)]
Sin embargo, se itera igual en las dos:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
for tupla in a.items():
tupla
('a', 1)
('b', 9)
metodo: keys()
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
diccionario = {'color': 'rosa', 'marca': 'Zara', 'talle': 'U'}
for clave in diccionario.keys():
clave
'marca'
'talle'
'color'
Obtener claves en una lista:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> diccionario = {'color': 'rosa', 'marca': 'Zara', 'talle': 'U'}
>>> claves = list (diccionario.keys())
>>> claves
['color', 'marca', 'talle']
metodo: values()
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
diccionario = {'color': 'rosa', 'marca': 'Zara', 'talle': 'U'}
for clave in diccionario.values():
clave
'rosa'
'Zara'
'U'
Obtener valores en una lista:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
diccionario = {'color': 'rosa', 'marca': 'Zara', 'talle': 'U'}
claves = list(diccionario.values())
Salida: ['Zara', 'U', 'rosa']
Para contar los elemetos de un diccionario, al igual que con las listas y tuplas, se utiliza la funcion integrada len()
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
diccionario = {'color': 'rosa', 'marca': 'Zara', 'talle': 'U'}
len(diccionario)
# Salida: 3
2 niveles para trabajar con ficheros y directorios
Uno de ellos es con el modulo 'os' , facilita el trabajo con el sistema de ficheros y directorios a nivel del propio S.O.
Segundo nivel , permite manipular ficheros su lectura y escritura desde la propia apliación o el script creado , tratando cada fichero como un objeto.
Existen varios modos de abrir un fichero , leer, escribir, o leer y escribir.
Cuando abres un fichero , se crea un puntero en memoria
r -> solo lectura -> ubicacion puntero: inicio fichero rb -> solo lectura modo binario -> ubicacion puntero: inicio fichero r+ -> lectura y escritura -> ubicacion puntero: inicio fichero rb+ -> lectura y escritura modo binario -> ubicacion puntero: inicio fichero
w -> solo escritura, sobreescribe fichero si existe, crea el fichero si no existe -> ubicacion puntero: inicio fichero wb -> solo escritura modo binario, sobreescribe fichero si existe, crea el fichero si no existe -> ubicacion puntero: inicio fichero w+ -> escritura y lectura, sobreescribe fichero si existe, crea el fichero si no existe -> ubicacion puntero: inicio fichero wb+ -> escritura y lectura modo binario, sobreescribe fichero si existe, crea el fichero si no existe -> ubicacion puntero: inicio fichero
a -> agregar contenido, crea fichero si no existe -> ubicacion puntero: si fichero existe al final del fichero, si el fichero no existe, al comienzo. ab -> agregar contenido en modo binario, crea el fichero si no existe -> ubicacion puntero: si fichero existe al final del fichero, si el fichero no existe, al comienzo. a+ -> agregar contenido y lectura, crea el fichero si no existe -> ubicacion puntero: si fichero existe al final del fichero, si el fichero no existe, al comienzo. ab+ -> agregar contenido y lectura modo binario, crea el fichero si no existe -> ubicacion puntero: si fichero existe al final del fichero, si el fichero no existe, al comienzo.
El objeto file , dispone de algunos métodos , algunos de ellos son(el resto a buscar o consultar por internet):
read([bytes]) -> lee el contenido de un fichero, si le pasas cantidad de bytes, leera solo esa cantidad del fichero.
readlines() -> lee todas las líneas de un fichero
write(cadena) -> escribe cadena en el fichero
writelines(secuencia) -> secuencia será cualquier iterable cuyos elementos seran escritos uno por línea.
La estructura with y la funcion open(), puede abrirse un fichero en cualquier modo y trabajar con él, sin necesidad de cerrarlo o destruir el puntero.
leer un fichero:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
with open("archivo.txt", "r") as archivo:
contenido = archivo.read()
escribir en un archivo:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
contenido = """
Este será el contenido del nuevo archivo.
El archivo tendrá varias líneas.
"""
with open("archivo.txt", "r") as archivo:
archivo.write(contenido)
csv "comma separated values" (valores separados por coma) , archivos de texto plano , destinados al almacenamiento de datos.
ejemplos:
- Datos meteorologicos separados por ';'
ID;DATA;VV;DV;T;HR;PPT;RS;P 0;2016-03-01 00:00:00;;;9.9;73;;;
- Puntuaje por jugadores de un torneo separados por coma
nombre,cantidad,año Maria,858,1930
- Datos de empresas registradas separados por ',' y datos entre '""'
"numero_correlativo","tipo_societario","detalles" "10","10","bar de barrio"
- Datos almacenados en archivos de TXT con formato similar en un CSV
FECHA TMAX TMIN NOMBRE
07122017 28.0 19.0 PELUQUERIAS
Modulo 'csv' , facilita el parseo de los datos de archivos CSV , para lectura y escritura.
El modulo 'csv' se utiliza en combinación con la estructura 'with' y la función 'open' para leer , generar archivo. El modulo 'csv' para su analisis(parsing).
contenido de archivo.csv
0;2016-03-01 00:00:00;;;9.9;73;;;
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from csv import reader
with open("archivo.csv", "r") as archivo:
documento = reader(archivo, delimiter=';', quotechar='"')
for fila in documento:
' '.join(fila)
salida: '0 2016-03-01 00:00:00 9.9 73 '
cuando el fichero CSV tiene una cabecera, es necesario saltar dicho encabezado:
contenido archivo.csv
ID;DATA;VV;DV;T;HR;PPT;RS;P 0;2016-03-01 00:00:00;;;9.9;73;;;
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from csv import reader
with open("archivo.csv", "r") as archivo:
documento = reader(archivo, delimiter=';', quotechar='"')
cabeceras = next(documento)
for fila in documento:
' '.join(fila)
salida: '0 2016-03-01 00:00:00 9.9 73 '
Otra forma de leer arhivos CSV con cabeceras, es usar el objetivo 'DictReader' en vez de 'reader' y asi acceder solo al valor de las columnas deseadas, por su nombre:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from csv import DictReader
with open("archivo.csv", "r") as archivo:
documento = DictReader(archivo, delimiter=';', quotechar='"')
for fila in documento:
fila['DATA']
salida: '0 2016-03-01 00:00:00'
Escritura de un CSV sin cabecera:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from csv import writer
with open("datos.csv", "w") as archivo:
doc = writer(archivo, delimiter=';', quotechar='"')
doc.writerows(matriz)
En el ejemplo anterior, una matriz podria ser una lista de listas con igual cantidad de elementos. Por ejemplo:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
matriz = [
['Juan', 373, 1970],
['Ana', 124, 1983],
['Pedro', 901, 1650],
['Rosa', 300, 2000],
['Juana', 75, 1975],
]
Lo anterior generaria un fichero llamado datos.csv
cat datos.csv
Juan;373;1970
Ana;124;1983
Pedro;901;1650
Rosa;300;2000
Juana;75;1975
Escritura de un csv con cabeceras:
La matriz siguiente se compone de una lista de diccionarios donde las claves coinciden:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
matriz = [
dict(jugador='Juan', puntos=300, año=2005)
dict(jugador='Ana', puntos=100, año=2022)
dict(jugador='Pedro', puntos=50, año=2021)
dict(jugador='Rosa', puntos=70, año=2001)
dict(jugador='Juana', puntos=80, año=1998)
]
from csv import DictWriter
cabeceras = ['jugador', 'puntos', 'año']
with open("datos.csv", "w") as archivo:
documento = DictWriter(
archivo, delimiter=';',
quotechar='"',
fieldnames=cabeceras
)
documento.writeheader()
documento.writerows(matriz)
Python tiene soporte nativo para busquedas con expresiones regulares.
Expresion regular es un patron de caracteres de reconomiento.
Cuando se aplica una expresion regular a una cadena de texto , permite encontrar fragmentos de texto que coincidan con esa expresion.
Para crear patrones y definirlos se crean mediante caracteres de forma simbolica.
Ejemplo: '^ho' -> cadena que empieza por 'ho' 'la$' -> cadena que finaliza por 'la'
Lista de caracteres simbolicos para expresiones regulares:
-
Caracteres de posicion: '^' -> inicio de cadena '$' -> final de cadena
-
Cuantificadores: '?' -> cero o uno '*' -> cero o mas '+' -> uno o mas '{n}' -> n veces '{n,}' -> n o mas veces '{,m}' -> entre 0 y n veces '{n,m}' -> entre n y m veces
-
Caracteres de posicion , agrupamiento: '(...)' -> grupo exacto '[...]' -> caracteres opcionales y rangos '|' -> operador logico <> (A|B) '-' -> usado para expresar un rango [a-z]
-
Caracteres de formato: '' -> caracter de escape para expresar literales '\d' -> digito '\D' -> caracter que no sea un digito '.' -> cualquier caracter excepto el salto de linea '\n' -> salto de linea '\s' -> espacio en blanco '\S' -> caracter que no sea espacio en blanco '\w' -> palabra '\W' -> caracter que no sea una palabra
El modulo 're' sirve para realizar busquedas mediante expresiones regulares. Este modulo tiene la funcion 'search' para realizar busquedas mediante sintaxis:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
search(expresion, cadena)
Una busqueda mediante funcion 'search' , en caso de encontrar una coincidencia , retorna un objeto 'SRE_Match'. Se accede a cada grupo de coincidencia con el metodo 'group(indice)'
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from re import search
cadena = "hola mundo"
ser = search("a\sm", cadena)
ser.group(0)
'a m'
En la administracion de sistemas Linux , el uso del constructor 'with' para abrir ficheros, combinado con metodos del 'objeto string' y 'expresiones regulares' , se puede emplear para analisis de registros del sistema.
ejemplo con '/var/log/auth.log'
Dec 3 20:07:16 serverrpi sshd[27860]: Failed password for invalid user joselito from x.x.x.x port 51072 ssh2
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from re import search
with open ("/var/log/auth.log", "r") as f:
log = f.read()
regex = "(.)+: Failed password for invalid user [a-z]+\n"
ser = search(regex, log)
ser.group(0) Dec 3 20:07:16 serverrpi sshd[27860]: Failed password for invalid user joselito from x.x.x.x port 51072 ssh2
- expresion anterior:
(.)+ -> indica cualquier caracter una o mas veces. Esto coincide con la fecha del registro, comando e ID del proceso: 'Dec 3 20:07:16 serverrpi sshd[27860]' La cadena que sigue, es un literal.
[a-z]+ -> coincide con el nombre de usuario ya que indica cualquier letra entra la a y la z, repetidas una o mas veces.
\n -> el salto de linea coincidiria con el final del registro.
Se puede usar este mismo sistema para analisis de registros de servicios , sistema , etc.. por ejemplo Apache , syslog , suricata u otros..
Para crear un menu de opciones basico en terminal:
-
- todo el script debe estar organizado en funciones
-
- cada funcion debe tener su documentacion para definir que hace cada funcion.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def leer_archivo():
"""Leer archivo CSV"""
return "leer"
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def escribir_archivo():
"""Escribir archivo CSV"""
return "escribir"
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def _sumar_numeros(lista):
"""Sumar los numeros de una lista"""
return "privada"
-
- Despues se define una lista con el nombre de las funciones , que seran accesibles desde el menu:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
funciones = ['leer_archivo', 'escribir_archivo']
Para automatizar la generacion del menu , basta con:
-
lista del paso3
-
funcion 'locals()'
-
atributo 'doc'
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
numero = 1 # se usara luego para acceder a la funcion
menu = "elija una opcion:\n"
for funcion in funciones:
menu += "\t{}. {}\n".format(
numero, locals()[funcion].__doc__)
numero += 1 # incrementa el numero en cada iteracion
print(menu)
opcion = int(input("Su opcion: "))
Para acceder dinamicamente a la funcion elegida por el usuario, el truco consistira en emplear la opcion elegida por el usuario , de forma que la opcion elegida sea el indice para acceder al nombre de la funcion desde la lista, y recurrir nuevamente a 'locals' para invocar la funcion.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
funcion = funciones[opcione - 1]
# se obtiene el nombre de la funcion
locals()[funcion]()
# se invoca a la funcion mediante 'locals()'
En el apartado anterior se muestra la forma de realizar un menu de forma simple.
En este apartado vamos a ver como analizar argumentos, pasados al script, por linea de comandos, mediante el modulo 'argparse'
importar la clase ArgumentParser del modulo argparse:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from argparse import ArgumentParser
Se construye un objeto 'ArgumentParser' para establecer los argumentos que el programa recibira.
Los parametros aceptados por el metodo constructor del objeto 'ArgumentParser' (funcion 'init') son todos opcionales.
algunos parametros:
-
prog -> el nombre del programa.
-
description -> descripcion del programa que se mostrara en la ayuda.
-
epilog -> texto mostrado al final de la ayuda.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from argparse import ArgumentParser
argp = ArgumentParser(
description='Descripcion breve del programa',
epilog='Copyright 2022 Autor bajo licencia'
)
Para agregar un argumento puede emplearse el metodo 'add_argument'
Existen dos tipos de argumentos para declarar:
-
argumentos posicionales: todos aquellos que sean declarados con un nombre en vez de usar una bandera
-
argumentos con opciones (banderas / flags): todos aquellos que empleen el prefijo de opcion '-'
Un argumento definido como 'foo' es posicional , mientras que otro se define de la siguiente manera '-f' o '--foo' sera una opcion:
argp.add_argument('foo') # argumento posicional argp.add_argument('--foo') # opcion foo argp.add_argument('-f') # opcion f
'add_argumento' puede recibir , un solo nombre de argumento posicional o una lista de banderas de opcion (flags)
En el siguiente ejemplo , en caso de ejecutarse sin ningun argumento , el fallo se produciria por la ausencia del argumento posicional 'directorio' , pero no por la ausencia de las opciones -f o --foo
argp.add_argument('directorio') # solo un nombre posicional argp.add_argument('-f', '--foo') # una lista de banderas de opcion
metodo 'add_argument' , ademas del nombre de argumento posicional y opcion , puede recibir de forma no obligatoria, algunos parametros que establecen la forma en la que el nombre de argumento o bandera seran tratados.
parametros opcionales:
-
'action' -> accion a realizar con el parametro -> store (almacenar valor) , append (agregarlo a una lista) -> store (valor por defecto)
-
'nargs' -> cantidad de valores admitidos
-
'default' -> valor por defecto para el argumento
-
'type' -> tipo de datos
-
'choices' -> lista de valores posibles
-
'required' -> indica si el argumento es obligatorio
-
'help' -> texto de ayuda a mostrar para el argumento
-
'metavar' -> el nombre del argumento que se empleara en la ayuda
-
'dest' -> nombre de la variable en la que sera almacenado el argumento
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
argp.add_argument(
'vocal', # argumento posicional
nargs='+', # admite uno o mas valores
choices=['a', 'e', 'o'], # valores posibles
metavar='VOCAL', # nombre de la variable a mostrar en la ayuda
help='Vocal abierta', # texto a mostrar como ayuda
)
Siguiendo el ejemplo anterior, si el programa se ejecutara sin argumentos:
usuario@host:~$ ./ejemplo.py
daria el siguiente error:
usage: ejemplo [-h] VOCAL [VOCAl ...] curl: ejemplo: the following arguments are required: VOCAL
y si se ejecutase con la bandera de opcion -h:
usuario@host:~$ ./ejemplo.py -h
arrojaria la siguiente ayuda:
usage: ejemplo [-h] VOCAL [VOCAl ...]
Descripcion del programa
positional arguments: VOCAL Vocal abierta
optional arguments: -h, --help show this help message and exit
argumentos = argp.parse_args()
El metodo 'parse_args' es el encargado de generar un objeto cuyas propiedades seran los argumentos recibidos por linea de comandos. A cada argumento se accedera mediante la sintaxis:
objeto_generado.nombre_del_argumento
Por ejemplo:
argumentos.foo
Ejemplo con 'argparse':
- Menu basado en el programa curl:
Intentar imprimir los valores obtenidos mediante 'argumentos.parametro'
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from argparse import ArgumentParser
descripcion_del_programa = "{}, {}".format(
"herramienta para transferir datos desde o hacia un servidor",
"utilizando uno de los protocolos compatibles"
)
argp = ArgumentParser(
prog='curl',
description=descripcion_del_programa,
)
argp.add_argument(
'-H', '--header', # banderas
action='append', # lista de valores
nargs='+', # admite uno o mas valores
type=str, # convertir los valores a string
metavar='LINE', # nombre de opcion a mostrar en la ayuda
help='Cabecera adicional a incluir en la solicitud HTTP a enviar'
)
argp.add_argument(
'-d', '--data',
action='append',
nargs='+',
type=str,
help='envia los datos especificados en una solicitud post, al servidor http'
)
argp.add_argument(
'url',
type=str,
metavar='URL',
help='URL a la cual realizar la solicitud'
)
argumentos = argp.parse_args()
observaciones:
Recordar que la especificacion de la codificacion de caracteres UTF-8, en python3 no es necesario ya que por defecto se interpreta, se utiliza para hacerlo compatible con python2 y frente a algunos tipos de objetos y biblitecas.
En caso de que un programa o un script del sistema , guarde registro , se puede emplear modulo 'logging'
El modulo logging provee cinco niveles de registros:
-
DEBUG -> 10 -> utilizado para monitorizar el funcionamiento de un programa , para depurar y obtener info.
-
INFO -> 20 -> registrar eventos afirmativos , un registro detallado de tareas ejecutadas de forma satisfactoria
-
WARNING -> 30 -> emitir una alerta sobre un evento determinado , informacion indicativa de un posible fallo
-
ERROR -> 40 -> registrar un error , informacion cuando no logra llevarse a cabo una tarea X.
-
CRITICAL -> 50 -> registrar un error que frene la ejecucion normal del programa , cuando un error fatal es capturado y el programa esta impedido.
nivel por defecto es WARNING , en caso de querer mostrarse otro nivel como INFo o DEBUG, debera modificarse el nivel de registro por defecto.
Los registros se muestran por pantalla o se graban en un fichero.
Constantes: representan distintos niveles de registro.
- constantes: INFO, DEBUG, WARNING, ERROR, CRITICAL
Clase 'basicConfig' , es usada para inicializar un registro , configurar el nivel de registro por defecto, y opcionalmente , establecer la ruta del archivo de registro y el modo de escritura.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from logging import basicConfig, INFO
basicConfig(
filename='/var/log/programa.log',
filemode='a',
level=INFO
)
los parametros compartidos en ambas ramas del lenguaje, para 'basicConfig' con los siguientes:
-
filename: ruta del archivo
-
filemode: modo de apertura (comunmente 'a' [append, valor por defecto] o 'w' [escritura])
-
format: establece el formato en el que se generan los registros
-
datefmt: formato de fecha y hora que se utilizara en los registros
-
level: nivel de registro (cualquiera de las 5 constantes)
-
stream (esta opcion no sera abarcada en el curso)
Algunos de las variables admitidas como parte del valor del parametro format, son las siguientes:
logrecord-attributes
asctime %(asctime)s
created %(created)f
filename %(filename)s
funcName %(funcName)s
levelname %(levelname)s
levelno %(levelno)s
lineno %(lineno)d
module %(module)s
msecs %(msecs)d
message %(message)s
name %(name)s
pathname %(pathname)s
process %(process)d
processName %(processName)s
relativeCreated %(relativeCreated)d
thread %(thread)d
threadName %(threadName)s
Para una descripcion detallada , ver la seccion 'logRecords Attributes' en la documentacion oficial de Python. Ambas ramas conservan las mismas variables.
'[%(asctime)s] [%(levelname)s] [pid %(process)d] MYAPP myErrorLevel Alert: %(message)s'
El ejemplo anterior, producira un registro similar al siguiente:
[2018-04-20 00:34:42,803] [WARNING] [pid 12318] MYAPP myErrorLevel Alert: posible violacion de seguridad
Para establecer el formato que tendra la fecha, mediante el parametro 'datefmt' se pueden emplear las siguientes directivas:
- Funciones de registro: utilizadas par amostrar o grabar los diferentes mensajes de registro:
info(), debug(), warning(), error(), critical()
A estas funciones se les debe pasar como parametro el mensaje que se deea almacenar en el registro:
funcion("mensaje a grabar")
Tambien es posible emplear variables como parte del mensaje, utilizando modificadores formato en la cadena, y pasando las variables como argumentos:
funcion("mensaje %s %i", variable_string, variable_entero)
siguiente codigo es un ejemplo y permite entender como funciona niveles de registro y mensajes, bibliotecas:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from logging import basicConfig, error, info, INFO
from sys import argv
basicConfig(
filename='ejemplo_logging.log',
filemode='a',
level=INFO,
format='[%(asctime)s] [%(levelname)s] [pid %(process)d] %(message)s',
datefmt="%d/%m/%Y %H:%M"
)
try:
with open(argv[1], "a") as f:
f.write(argv[2])
info("Agregado el texto %s al archivo %s", argv[2], argv[1])
except:
error("Se produjo un error al intentar escribir en el archivo %s", argv[1])
try:
with open("/var/log/foo.log", "a") as f:
f.write("Mensaje de prueba")
except (Exception) as problema:
error(problema)
'argv' , una lista del modulo system, almacena los argumentos pasados al script por linea de comandos, siendo la ruta del archivo o nombre del ejecutable, el primer elemento de la lista.
La estructura 'try / except' permite cpaturar excepciones que de otro modo provocarian la finalizacion abrupta del script, cuando una excepcion es lanzada.
cuando una instruccion o algoritmo tiene la posibilidad de fallar (normalmente, cuando depende de valores obtenidos al vuelo), puede colarse el codigo , dentro de la estructura 'try' y utilizar 'excep' para ejecutar una accion en caso de que el intento de ejecucion de codigo del 'try' falle. Su sintaxis podria interpretarse como la siguiente:
intentar: ejecutar esto si falla: haz esto otro
Pasado al lenguaje de Python:
try: # instruccion que puede fallar except: # instruccion a ejecutar en caso de que el codigo del try, falle
El tipo de excepcion lanzada, tambien es posible capturarlo:
try: # instruccion que puede fallar except (TipoDeExcepcion1): # instruccion a ejecutar en caso de que se produzca # una excepcion de tipo TipoDeExcepcion1 except (TipoDeExcepcion2): # instruccion a ejecutar en caso de que se produzca # una excepcion de tipo TipoDeExcepcion2
Tambien es admisible capturar mas de un tipo de excepcion de forma simultanea:
try: # instruccion que puede fallar except (TipoDeExcepcion1, TipoDeExcepcion2): # instruccion a ejecutar en caso de que se produzca # una excepcion de tipo TipoDeExcepcion1 o # TipoDeExcepcion2
E incluso, puedo capturarse una descripcion del error, aunque no se conozca el tipo de excepcion:
try: # instruccion que puede fallar except (Exception) as descripcion_del_problema: # instruccion a ejecutar en caso de que se produzca # una excepcion de tipo TipoDeExcepcion1 o # TipoDeExcepcion2
Los diferentes 'tipos de excepciones', pueden estudiarse en la documentacion oficial de Python2 y de Python3. tipos de excepciones Python2 tipos de excepciones Python3
Para un nivel inicial se recomienda trabajar solo con except.
Los modulos 'os' y 'subprocess' permiten manejar funcionalidades del sistema operativo y procesos del sistema. El modulo 'sys' provee acceso a variables del interprete del lenguaje. El modulo 'shutil' permite manejar archivos a alto nivel. El modulo 'os' provee funciones que operan a bajo nivel.
Con este modulo permite operar a bajo nivel con funcionalidades del sistema operativo. Algunas funcionalidades:
accion | comando Linux | Metodo |
---|---|---|
ACCESO A FICHEROS Y DIRECTORIOS | ||
obtener directorio actual | pwd | getcwd() |
cambiar directorio | cd ruta | chdir(path) |
mover directorio trabajo a raiz | cd | chroot() |
modificar permisos | chmod | chmod(path,permisos) |
cambiar propietario | chown | chown(path,permisos) |
crear directorio | mkdir | mkdir(path[, modo]) |
crear directorios recursivos | mkdir -p | mkdirs(path[, modo]) |
eliminar fichero | rm | remove(path) |
eliminar directorio | rmdir | rmdir(path) |
renombrar fichero | mv | rename(actual,nuevo) |
crear enlace simbolico | ln -s | symlink(origen,destino) |
establecer mascara creacion ficheros | umask | umask(mascara) |
obtener listado ficheros y directorios | ls -a | listdir(path) |
obtener estado fichero | stat | stat(path) |
evaluacion de ficheros y directorios (modulo os.path) | ||
obtener ruta absoluta | - | path.abspath(path) |
obtener directorio base | - | path.basename(path) |
saber si un directorio existe | - | path.exists(path) |
conocer ultimo acceso a un directorio | - | path.getatime(path) |
conocer tamaño del directorio | - | path.getsize(path) |
saber si una ruta es: | - | |
absoluta | - | path.isabs(path) |
un fichero | - | path.isfile(path) |
un directorio | - | path.isdir(path) |
un enlace simbolico | - | path.islink(path) |
un punto de montaje | - | path.ismount(path) |
FUNCIONALIDADES DEL S.O. | ||
obtener valor variable entorno | $VARIABLE | getenv(variable) |
obtener datos del s.o. | uname -a | uname() |
obtener UID | id -u | getuid() |
Obtener ID del proceso | pgrep | getpid() |
crear variable de entorno (del sistema) | export $VARIABLE | puntenv(variable, valor) |
forzar la escritura del cache al disco | sync | sync() |
matar un proceso | kill | kill(pid, señal) |
'environ' es un direccionario del modulo 'os'. Este direccionario tiene variables de entorno , las cuales adquieren un valor dependiente del sistema donde se ejecuten.
ver variables de entorno disponibles de 'environ':
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from os import environ
for variable, valor in environ.items():
variable, valor
la funcion 'system' del modulo 'os' , permite ejecutar comandos del sistema sin manejar la E/S estandar o los errores.
Se lanza directamente sobre el s.o.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from os import system
command = "curl http://unawebdeconsulta"
system(command)
con la funcion 'system' , podemos redireccionar la salida de los comandos o los errores.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from os import system
command = "curl http://unawebdeconsulta > salida"
system(command)
para acceder a la salida almacenada , se puede leer como si fuera un fichero:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from os import system
command = "curl http://unawebdeconsulta > salida"
system(command)
with open('salida', 'r') as f:
salida = f.read()
A traves de la clase 'Popen' del modulo 'subprocess' , es posible ejecutar comandos directamente sobre el s.o. y manipular tanto la E/S estandard como errores.
la funcion 'split' del modulo 'shlex' puede emplearse como complemento de 'Popen' , para el parseado de cadenas de texto como lista de comandos y argumentos.
La clase 'Popen' (process open) , abre un nuevo proceso en el sistema , y permite manejar tuberias para manejar la E/S estandard y errores.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from subprocess import Popen, PIPE
proceso = Popen(<comando/argumentos>, stdout=PIPE, stderr=PIPE)
el primer argumento pasado a 'Popen' debe ser una lista. Debe contener el comando , las opciones(banderas) , y argumentos. Por ejemplo:
ls -ls /home/usuario/descargas
ls -> argumento
-ls -> lista opciones
/home/usuario/descargas -> argumento
total 3 elementos
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from subprocess import Popen, PIPE
lista = ['ls', '-ls', '/home/usuario/descargas']
proceso = Popen(lista)
Sin embargo , la instruccion completa podria escribirse en una cadena de texto. Y con la funcion 'split' del modulo 'shlex' , emplearla para generar la lista necesaria para Popen:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from shlex import split
from subprocess import Popen
comando = 'ls -ls /home/usuario/descargas'
proceso = Popen(split(comando))
se pueden emplear tuberias para capturar la Salida estandar y los errores:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from shlex import split
from subprocess import Popen
comando = 'ls -ls /home/usuario/descargas'
proceso = Popen(split(comando), stdout=PIPE, stderr=PIPE)
salida = proceso.stdout.read()
errores = proceso.stderr.read()
if not errores:
accion a realizar si no hubo errores
else:
accion a realizar si hubo errores
en la linea de comandos , se puede emplear la salida de un comando para redirigir la salida a otro comando. Con '|' pipe. ejemplo:
ls -ls /home/user/descargas/fichero.txt | grep 'user'
la salida de 'ls' se utiliza como entrada del comando 'grep'
Cuando usamos 'Popen' la salida de un comando se encuentra disponible en:
'proceso_creado.stdout'
Esta salida se puede usar como valor del argumento 'stdin' , del segundo proceso creado por 'Popen'.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from shlex import split
from subprocess import Popen, PIPE
#comandos necesarios
ls_command = "ls -ls /home/user/descargas/fichero.txt"
grep_command = "grep 'user'"
# procesos
ls_process = Popen(
split(ls_command), stdout=PIPE, stderr=PIPE)
grep_process = Popen(
split(grep_command),
stdin=ls_process.stdout,
#salida del proceso anterior como entrada
stdout=PIPE,
stderr=PIPE
)
#ejecucion
grep_process.stdout.read()
algunas variables del modulo 'sys':
variable | Descripcion |
---|---|
sys.argv | retorna una lista con todos los argumentos pasados |
sys.executable | retorna el path absoluto del path ejecutado |
sys.path | retorna una lista con las rutas empleadas para buscar ficheros |
sys.platform | retorna la plataforma donde se esta ejecutando el interprete |
sys.version | retorna el numero de version de Python e informacion adicional |
La funcion 'exit()' del modulo 'sys' se emplea para finalizar un programa o script de forma abrupta.
ejemplo:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from shlex import split
from subprocess import Popen, PIPE
ls = "ls -ls /hom/noexiste"
grep = "grep 'user'"
ps_ls = Popen(split(ls), stdout=PIPE, stderr=PIPE)
if ps_ls.stderr.read():
exit("Terminacion abrupta tras error en comando ls")
ps_grep = Popen(
split(grep),
stdin=ps_ls.stdout,
stdout=PIPE,
stderr=PIPE
)
-
el mensaje pasado a la funcion 'exit()' es opcional
-
la funcion 'exit()' puede recibir un entero representativo del motivo de salida (el 0 es valor por defecto, indica salida normal)
-
la funcion 'exit()' del modulo 'sys' tiene un proposito similar a la constante incorporada exit , sin embargo ambos elementos no responden de la misma manera
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
print sys.exit()
Python tiene las siguientes librerias:
-
libreria 'http' para realizar conexiones a los protocolos HTTP/HTTPS
-
libreria 'ftplib' para realizar conexiones a los protocolos FTP
-
libreria 'Paramiko' creada por Robey Pointer , para realizar conexiones al protocolo SSH
El modulo 'client' de la libreria 'http' nos da la posibilidad de conectar al protocolo http.
Mediante las clases 'HTTPConnection' y 'HTTPSConnection'
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from http.client import HTTPConnection
http = HTTPConnection('host.com', port=80, timeout=10)
port y timeout son 2 parametros opcionales.
las solicitudes se realizan mediante metodo 'request' y este requiere de dos parametros posicionales.
-
metodo HTTP usado (GET,POST...)
-
recurso HTTP (urn nombre de recurso uniforme)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from http.client import HTTPConnection
http = HTTPConnection('host.com', port=80, timeout=10)
http.request("GET", "/foor/bar")
se pueden añadir otros parametros:
-
headers -> diccionario con campos de cabecera
-
body -> cadena de texto
parametros utiles para peticiones que requieren envio de información.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from http.client import HTTPConnection
http = HTTPConnection('host.com', port=80, timeout=10)
parametros = "nombre=Juan&apellido=Perez"
cabeceras = {
"Content-Type": "application/x-www-form-urlencoded"
}
http.request(
"POST", "/foo/bar",
headers=cabeceras, body=parametros
)
La respuesta mediante el metodo 'getresponse' , retorna un objeto 'HTTPResponse' , en sus propiedades este metodo posee 'status' (codigo de respuesta HTTP), y 'reason' (descripcion de la respuesta), entre sus metodos 'read' , retorna el cuerpo de la respuesta:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
respuesta = http.getresponse()
codigo = respuesta.status
descripcion = respuesta.reason
body = respuesta.read()
El cierre de una conexion HTTP se realiza mediante el metodo 'close'
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
http.close()
ejemplo de una peticion POST a un host local:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from http.client import HTTPConnection
http = HTTPConnection('juanproyecto.local', port=80, timeout=30)
parametros = "nombre=Juan&apellido=Perez"
cabeceras = {"Content-Type": "application/x-www-form-urlencoded"}
http.request("POST", "/foor/bar", headers=cabeceras, body=parametros)
respuesta = http.getresponse()
codigo = respuesta.status
descripcion = respuesta.reason
body = respuesta.read()
body
codigo
descripcion
La biblioteca 'ftplib' permite conexiones mediante el protocolo FTP
Para crear una instancia , se dispone de las clases 'FTP' (sin cifrado) y 'FTP_TLS' (con cifrado TLS evolución SSL)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from ftplib import FTP
ftp = FTP()
Para abrir una conexión se empleta el metodo 'connect' , admite parametros como , host y puerto
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from ftplib import FTP
ftp = FTP()
ftp.connect('algunhost.com', 21)
Si es necesario usar el modo pasivo , se dispone del metodo 'set_pasv'
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from ftplib import FTP
ftp = FTP()
ftp.connect('algunhost.com', 21)
ftp.set_pasv(True)
La autenticación se realiza mediante el metodo 'login' , recibe por parametros , usuario y contraseña
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from ftplib import FTP
ftp = FTP()
ftp.connect('algunhost.com', 21)
ftp.set_pasv(True)
ftp.login('algunusuario', 'clave')
Para cerrar una conexión se puede usar el metodo 'quit' , esto cierra la conexion de ambos lados (cliente y servidor) El metodo 'close' cierra la conexión unilateralmente.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from ftplib import FTP
ftp = FTP()
ftp.connect('algunhost.com', 21)
ftp.set_pasv(True)
ftp.login('algunusuario', 'clave')
ftp.quit()
Otros metodos:
Accion | Metodo |
---|---|
Directorios | |
Lisar directorios | dir() , dir('ruta/a/listar') |
Crear un directorio | mkd('ruta/a/algun-dir') |
Moverse a un directorio | cwd('ruta/a/algun-dir') |
Eliminar un directorio | rmd('ruta/a/dir-a-borrar') |
Obtener directorio actual | pwd() |
Archivos | |
Recuperar un archivo remoto | retrbinary('RETR origen', open('/ruta/destino', 'w').write) |
Enviar un archivo local | storbinary('STOR destino/remoto.txt', open('/origen/local.txt', 'r')) |
Eliminar un archivo | delete('archivo/a/eliminar') |
Renombrar (mover) un archivo | rename('origen', 'destino') |
La biblioteca 'getpass' , permite solicitar mediante un input , un password , para no tener que trabajar con el password en crudo en el codigo fuente.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from getpass import getpass
clave = getpass('Ingresar clave: ')
La funcion 'getpass' puede usarse de forma conjunta con metodo login (de esta forma se evita escribir la clave en crudo dentro del codigo fuente).
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from ftplib import FTP
from getpass import getpass
ftp = FTP()
ftp.connect('algunhost.com', 21)
ftp.login('algunusuario', getpass('Clave FTP: '))
La biblioteca 'paramiko' se de instalar de forma adicional (no esta en las bibliotecas de python). Se puede instalar a traves de PyPI (gestor de paquetes de python). En debian se puede instalar desde apt.
Para instalar un paquete desde PyPI , se necesita herramienta 'pip'.
apt install python-pip # para Python2
apt install python3-pip # para Python3
Las instalaciones para Python2 y Python3 , se manejan de forma independiente. Por tanto habra que instalar 'Paramiko' en ambas versiones.
mediante root:
pip install paramiko # para Python2
pip3 install paramiko # para Python3
Una conexion SSH se inicializa con la creación de un objeto 'SSHClient':
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from paramiko import SSHClient, AutoAddPolicy
ssh = SSHClient()
La conexión como la autenticación , se realizara de forma separada , para tener un mayor control.
Para la autenticación mediante llave pública , se empleara 'set_missing_host_key_policy' , a fin de localizar las llaves y facilitar el intercambio de las mismas:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
ssh.set_missing_host_key_policy(AutoAddPolicy())
Normalmente , el uso de este metodo no deberia ser necesario , y bastaria con emplear 'load_system_host_keys':
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
ssh.load_system_host_keys()
Utilizar 'set_missing_host_key_policy' , evita algoritmos complejos para captura y tratamiento de errores.
La conexion al servidor , se realizara mediante el metodo 'connect' , recibe con parametros , el host o IP del server y puerto de conexión , y nombre de usuario.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
ssh.connect('x.x.x.x', 22, 'usuario')
Cuando se requiera autenticacion por contraseña , se puede pasar como cuarto parametro el password:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
ssh.connect('x.x.x.x', 22, 'usuario', 'clave')
La ejecucion de comandos en el server , se realiza mediante el metodo 'exec_command' , donde se le pasa una cadena de instruccion que se desea ejecutar. Esto retorna tres objetos , de E/S estandar y errores:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
entrada, salida, error = ssh.exec_command('ls -la')
Se pueden leer los objetos de salida y error mediante 'read':
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
salida.read()
error.read()
La entrada puede ser escrita mediante write:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
entrada.write('entrada que espera el comando \n')
salida.read()
Para cerrar la conexion , se utiliza close:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
ssh.close()
Biblioteca 'tarfile' se le da uso para leer , comprimir y descomprimir ficheros (.tar, .tar.gz., tar.bz2, tar.xz) Otra biblioteca como 'zipfile' se utiliza para leer , comprimir y descomprimir , para los ficheros .zip
Para leer un fichero comprimido , para comprimir , o descomprimir un fichero TarFile , se hace mediante la función 'open' del modulo tarfile.
Los modos lectura y escritura , se realiza mediante la sintaxis:
<modo>:<formato>
En 'modo' puede ser 'r' (lectura) o 'w' (escritura) , y en 'formato' , gz (gzip) , bz2 (bzip2) o , solo en Python3 xz (lzma)
Modo de apertura | Comando tar |
---|---|
`[r | w]:gz` |
`[r | w]:bz2` |
`[r | w]:xz` |
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from tarfile import open as tar_open
with tar_open("origen.tar.bz2", "r:bz2") as tar:
tar.extractall('carpeta/destino')
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from tarfile import open as tar_open
with tar_open("carpeta/destino.tar.gz", "w:gz") as tar:
tar.add('foo.txt')
tar.add('bar.txt')
tar.add('baz.txt')
Se usa un alias , para que el metodo 'open' de la biblioteca 'tarfile' , no sobrescriba la funcion incorporada 'open'. Se emplea la estructura 'with' , para no utilizar el metodo 'close'.
Se debe verificar el nombre de los ficheros comprimidos a la hora de descomprimirse , el nombre del fichero puede contener '/' o '. .' , de manera que al descomprimir , se podrian descomprimir en un directorio del sistema no esperado.
El formato lzma solo esta disponible en la rama 3 de Python (Python3). Para que un script sea compatible con cualquier versión , usar los formatos , 'gzip' o 'bzip2'.
Ejemplo descomprimir o comprimir ficheros zip:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from zipfile import ZipFile
# Comprimir ficheros zip
with ZipFile('carpeta/destino.zip', 'w') as z:
z.write('foo.txt')
z.write('bar.txt')
z.write('baz.txt')
# Descomprimir ficheros zip
with ZipFile('carpeta/origen.zip', 'r') as z:
z.extractall('carpeta/destino', pwd='clave')
# el parametro pwd (contraseña) es opcional
En caso de que un script , guarde temporalmente ficheros , no es buena práctica que el mismo script los guarde y los elimine. Tampoco que se guarden en el directorio '/tmp'. Se debe emplear la biblioteca 'tempfile'
Cuando se crean objetos de ficheros temporales mediante la clase 'TemporaryFile' del modulo 'tempfile' , los ficheros se crean y se destruyen en el mismo tiempo de ejecución. (la destruccion se lleva a cabo al cerrar el fichero)
En caso de usar la estructura 'with' al finalizar la estructura , el fichero se habra eliminado.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from tempfile import TemporaryFile
with TemporaryFile() as tmp:
# aqui el fichero existe
# aqui el fichero ya no existe
Los ficheros temporales escritos , para que sean escritos , requieren que el contenido se pase como un objeto tipo bytes (y no una cadena). Este requerimiento es exigencia de Python3 , aunque en Python2 esta soportado. Para que una cadena sea combertido a bytes , bastaria con especificar el tipo:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from tempfile import TemporaryFile
with TemporaryFile() as tmp:
tmp.write(b"Cadena de texto que se pasara a bytes")
Finalmente se debe tener en cuenta que una vez escrito , el cursor estara al final del fichero. Cuando quiera leer retornada una cadena nula. Para ello habra que mover el cursor al byte 0 a fin de poder leerlo:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from tempfile import TemporaryFile
with TemporaryFile() as tmp:
tmp.write(b"Cadena de texto que se pasara a bytes")
# ... acciones intermedias
tmp.seek(0) # se mueve el cursos al byte 0
contenido = tmp.read()
Observacion: Los ficheros temporales creados con TemporaryFile , no persisten en memoria , sino en disco. Se almacenan en el directorio temporal del sistema. En caso de querer conocer el directorio temporal , invocar la funcion gettempdir()
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from tempfile import TemporaryFile, gettempdir
with TemporaryFile() as tmp:
tmp.write(b"Cadena de texto")
tmp_dir = gettempdit()
Estas bibliotecas permiten buscar ficheros que coincidan con un patron(con el mismo estilo empleado en sistemas Linux o Unix) Mientras que el modulo glob busca ficheros que coinciden con un patron. fnmatch verifica si un patron coincide con el nombre de un fichero.
Simbolo | Significado |
---|---|
* |
cualquier coincidencia |
? |
coincidencia con un unico caracter |
[secuencia] |
coincidencia con cualquier caracter de la secuencia |
[!secuencia] |
coincidencia con cualquier caracter , excepto los de la secuencia |
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from glob import glob
glob('*.txt')
['foo.txt', 'baz.txt', 'bar.txt']
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from glob import glob
glob('*[!of].txt')
['baz.txt', 'bar.txt']
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from os import listdir
from fnmatch import fnmatch
for archivo in listdir('.'):
... archivo, fnmatch(archivo, '*[!0-9].txt')
...
('3.r', False)
('foo.gif', False)
('.bar', False)
('carpeta', False)
('foo.txt', True)
('baz.txt', True)
('origen.tar.xz', False)
('.foo', False)
('2.r', False)
('bar.txt', True)
('.baz', False)
('origen.tar.bz2', False)
('a.r', False)
('1.r', False)
('origen.tar.gz', False)
metodo:
retorna:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
x