| You are here: Inicio > Inmersión en Python > Excepciones y gestión de ficheros > Resumen | << >> | ||||
Inmersión en PythonPython de novato a experto |
|||||
El programa fileinfo.py que presentamos en el Capítulo 5 debería ahora tener todo el sentido del mundo.
"""Infraestructura para obtener metadatos específicos por tipo de fichero. Instancie la clase apropiada con el nombre del fichero. El objeto devuelto actúa como un diccionario, con pares clave-valor por cada metadato. import fileinfo info = fileinfo.MP3FileInfo("/music/ap/mahadeva.mp3") print "\\n".join(["%s=%s" % (k, v) for k, v in info.items()]) O use la función listDirectory para obtener información de todos los ficheros en un directorio. for info in fileinfo.listDirectory("/music/ap/", [".mp3"]): ... Se puede extender esta infraestructura añadiendo clases para tipos particulares de fichero, por ejemplo HTMLFileInfo, MPGFileInfo, DOCFileInfo. Cada clase es completamente responsable de analizar sus ficheros adecuadamente; vea MP3FileInfo si desea un ejemplo. """ import os import sys from UserDict import UserDict def stripnulls(data): "strip whitespace and nulls" return data.replace("\00", "").strip() class FileInfo(UserDict): "store file metadata" def __init__(self, filename=None): UserDict.__init__(self) self["name"] = filename class MP3FileInfo(FileInfo): "store ID3v1.0 MP3 tags" tagDataMap = {"title" : ( 3, 33, stripnulls), "artist" : ( 33, 63, stripnulls), "album" : ( 63, 93, stripnulls), "year" : ( 93, 97, stripnulls), "comment" : ( 97, 126, stripnulls), "genre" : (127, 128, ord)} def __parse(self, filename): "parse ID3v1.0 tags from MP3 file" self.clear() try: fsock = open(filename, "rb", 0) try: fsock.seek(-128, 2) tagdata = fsock.read(128) finally: fsock.close() if tagdata[:3] == "TAG": for tag, (start, end, parseFunc) in self.tagDataMap.items(): self[tag] = parseFunc(tagdata[start:end]) except IOError: pass def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item) def listDirectory(directory, fileExtList): """obtener lista de objetos de información sobre ficheros de extensiones particulares""" fileList = [os.path.normcase(f) for f in os.listdir(directory)] fileList = [os.path.join(directory, f) for f in fileList if os.path.splitext(f)[1] in fileExtList] def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]): "obtener la clase de información de un fichero por su extensión" subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:] return hasattr(module, subclass) and getattr(module, subclass) or FileInfo return [getFileInfoClass(f)(f) for f in fileList] if __name__ == "__main__": for info in listDirectory("/music/_singles/", [".mp3"]): print "\n".join(["%s=%s" % (k, v) for k, v in info.items()]) print
Antes de sumergirnos en el próximo capítulo, asegúrese de que es capaz de hacer las siguientes cosas con comodidad:
<< Todo junto |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
Expresiones regulares >> |