Skip to content

Instantly share code, notes, and snippets.

@Fhernd
Created June 26, 2018 13:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Fhernd/f8fa50aacc28925a49145a8039f9f863 to your computer and use it in GitHub Desktop.
Save Fhernd/f8fa50aacc28925a49145a8039f9f863 to your computer and use it in GitHub Desktop.
Procesamiento de archivos por medio de tuberías. Python.
import os
import fnmatch
import gzip
import bz2
import re
def generador_encontrar(ruta, inicio):
'''
Encuentra los archivos en un directorio, y que cumplan con un patrón.
:param ruta: Ruta del directorio
:param inicio: Ruta de inicio
:return: Ruta absoluta del archivo
'''
for p, lista_directorios, lista_archivos in os.walk(inicio):
for nombre in fnmatch.filter(lista_archivos, ruta):
yield os.path.join(p, nombre)
def generador_apertura(nombre_archivos):
'''
Abre un conjunto de archivos. Los objetos de archivos se producen
a medida que se piden.
:param nombre_archivos: Nombre de los archivos
:return: Objeto archivo
'''
for nombre_archivo in nombre_archivos:
if nombre_archivo.endswith('.gz'):
f = gzip.open(nombre_archivo, 'rt')
elif nombre_archivo.endswith('.bz2'):
f = bz2.open(nombre_archivo, 'rt')
else:
f = open(nombre_archivo, 'rt')
yield f
f.close()
def generador_concatenacion(iteradores):
'''
Concatena una secuencia de iteradores en una única secuencia.
:param iteradores: Conjunto de iteradores.
:return: Cadena de iteradores
'''
for it in iteradores:
yield from it
def generador_expresion_regular(patron, lineas):
'''
Búsqueda a través de un patrón sobre una secuencia de líneas.
:param patron: Patrón de búsqueda
:param lineas: Líneas de contenido
:return: Línea que cumple con el patrón dado.
'''
expresion = re.compile(patron)
for linea in lineas:
if expresion.search(linea):
yield linea
loggings = generador_encontrar('access-log*', 'www')
archivos = generador_apertura(loggings)
lineas = generador_concatenacion(archivos)
lineas_python = generador_expresion_regular('(?i)python', lineas)
bytes_columnas = (linea.rsplit(None, 1)[1] for linea in lineas_python)
bytes = (int(x) for x in bytes_columnas if x != '-')
print('Total:', sum(bytes))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment