All pastes #1897534 Raw Edit

CRC32

public python v1 · immutable
#1897534 ·published 2010-07-09 23:22 UTC
rendered paste body
#!/usr/bin/env python# -*- coding: utf-8 -*-# Version 0.2 2009.01.25# Copyright (c) 2009, Taoufik El Aoumari# Released under the GPL license http://www.gnu.org/licenses/gpl-3.0.txt"""    ESTE PROGRAMA HA SIDO _REEDITADO POR                 -- NEKMO.COM --        email: contacto@nekmo.com             La licencia de este programa es:              - GPL 3.0 -         Versión del programa:          # 09/07/2010 (0.3)             Feature añadida a programa original:      - Dar CRC32 a archivos      - Pythonización      - Corrección bug size == 0      - Uso de logs      - Uso de argumentos en consola                                     """# Módulos requeridosimport sys, re, zlib, os# Parseador de entrada de consola (retrocompatibilidad)try:    import argparseff    parser2use = 'argparse'except ImportError:    from optparse import OptionParser    parser2use = 'optparse'# Módulo para generar logsimport logging#Coloresc_null  = "\x1b[00;00m"c_red   = "\x1b[31;01m"c_green = "\x1b[32;01m"p_reset = "\x08"*8 # modelo de nuevos archivosbase = '%s[%s]'def crc32_checksum(filename):    """Generador del CRC del archivo       filename: string                 Ruta al archivo"""        # Variables para comprobación    crc = 0    file = open(filename, "rb")    buff_size = 65536    size = os.path.getsize(filename)    done = 0        if not size:        # El archivo no tiene tamaño, salir        logging.error('El archivo %s no tiene datos' % filename)        return    try:        while True:            # Mientras haya datos...            data = file.read(buff_size)            done += buff_size            # informar de situación actual de conteo            sys.stdout.write("%7d"%(done*100/size) + "%" + p_reset)            if not data:                # Ya no hay más datos, salir                break            crc = zlib.crc32(data, crc)    except KeyboardInterrupt:        # Detectada excepción de interrupción por teclado        sys.stdout.write(p_reset)        # !!!Cerrar el archivo        file.close()        sys.exit(1)     sys.stdout.write(p_reset)    # !!!Cerrar el archivo    file.close()    # Cálculo    if crc < 0:        crc &= 2**32-1    return "%.8X" %(crc)def check(files):    """Comprobador del CRC del archivo       files: tuple or list              listado de nombres de archivos"""    for file in files:        try:            # Generar CRC32            crc = crc32_checksum(file)            if not crc:                return            # Encontrar CRC32 en el nombre de archivo            dest_sum = re.split("([a-fA-F0-9]{8})", file)[-2]            # CRC32 del nombre de archivo == CRC32 generado            if crc == dest_sum.upper():                c_in = c_green            else:                c_in = c_red            sfile = file.split(dest_sum)            logging.info("%s%s%s   %s%s%s%s%s" %                    (c_in,crc, c_null, sfile[0],                    c_in, dest_sum, c_null, sfile[1]))        except(IndexError, ValueError):            logging.error(crc + "   " + file)        except IOError, e:            logging.error(e)            continuedef putcrc32(files):    """Generador del CRC del archivo       files: tuple or list              listado de nombres de archivos"""        for file in files:        try:            # Generar CRC32            crc = crc32_checksum(file)            if not crc:                return            # Si hay un punto... (extensión)            if '.' in file:                # hay un punto (por tanto extensión)                file_split = file.split('.')                ext = '.' + file_split[-1]                new_file = base  % ('.'.join(file_split[0:-1]), crc)            else:                # no hay extensión                ext = ''                new_file = base  % (file, crc)            # Informar del cambio de nombre de archivo            logging.info('%s -> %s' % (file, new_file + ext))            # Renombrar archivo            os.rename(file, new_file + ext)        except(IndexError, ValueError):            print(crc+"   "+file)        except IOError, e:            print(e)            continueif __name__ == '__main__':    # Configuración de los logs    logging.basicConfig(level=20, format='%(levelname)-8s %(message)s')        # Retrocompatibilidad de sistema de argumentos de entrada en consola    if parser2use == 'argparse':        # Description        parser = argparse.ArgumentParser(description=                                     'Generador y comprobador de CRC32\'s')        # putcrc32        parser.add_argument('-p', '--putcrc32', dest='putcrc32', nargs='+',                help='Generar CRC32\'s de archivos y cambiar los nombres con ellos.')        # check        parser.add_argument('-c', dest='check', nargs='+',                help='Comprobar el CRC32 de los archivos.')        args = parser.parse_args()        files = args.putcrc32    elif parser2use == 'optparse':        # Object        parser = OptionParser()        # putcrc32        parser.add_option('-p', '--putcrc32', action='store_true', dest='putcrc32',                help='Generar CRC32\'s de archivos y cambiar los nombres con ellos.')        # check        parser.add_option('-c', '--check', action='store_true', dest='check',                help='Comprobar el CRC32 de los archivos.')        args, files = parser.parse_args()        files = files        if args.putcrc32:        # Generar CRC32 de los archivos        putcrc32(files)    else:        # Comprobar los CRC32 de los archivos        check(sys.argv[2:])