PythonChallenge niv.6 Revision 326438313332 (Mon Feb 09 2009 at 19:51) - Diff Link to this snippet: https://friendpaste.com/1EHdO38p7edFDOxxAHDOQ8 Embed: manni perldoc borland colorful default murphy trac fruity autumn bw emacs pastie friendly Show line numbers Wrap lines 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263641656667686970171#! /usr/bin/env python# -*- coding: utf-8 -*-########################################################## Script pour relever le niveau 6 du PythonChallenge #### http://www.pythonchallenge.com/pc/def/channel.html ##########################################################import sys, os, time, zipfileroot = '/home/user/Python/Exercices/channel'ext = '.txt'def lecture(cible, repertoire, ext): """ Retourne le contenu du fichier. """ path = os.path.join( repertoire, cible+ext) if not os.path.exists(path): print "Le fichier <%s> n'existe pas" % path return return open(path,'r').readlines()def collecte(archive_zip, fichier): """ Retourne les commentaires associées aux fichiers parcourus. """ return(archive_zip.getinfo(fichier+ext).comment)def findnext(texte): """ Retourne le nom du prochain fichier qui est numérique dans une liste, ou la valeur False. """ texte = texte.split(' ') if 'nothing' not in texte: return False return [x for x in texte if x.isdigit()]def main(source = root, fichier='readme', res= []): """ Fonction principale du défi. Elle permet de passer de fichier en fichier, en collectant les commentaires dans l'archive zip et en trouvant le prochain indice contenu dans le fichier texte. """ f=zipfile.ZipFile(source+'.zip') contenu = "".join([x for x in lecture(fichier, source, ext)]) res.append(collecte(f, fichier)) fichier =findnext(contenu)[-1] while fichier.isdigit(): contenu = "".join([x for x in lecture(fichier, source, ext)]) res.append(collecte(f, fichier)) if not findnext(contenu): break fichier = findnext(contenu)[-1] f.close() return fichier, contenu, resdef start(): """ Gère le lancement de l'application et renvoie les informations recueillies intéressantes (Nom du dernier fichier parcouru, son contenu et affichage des commentaires recueillis. """ if len(sys.argv) >= 2: t0 = time.time() if len(sys.argv)==3: # A ameliorer avec une list comprehension??? # car sys.argv peut recevoir 2 ou 3 arguments fichier= sys.argv[2] fichier, contenu, res= main(sys.argv[1]) print "%s contenait %s "%(fichier,contenu) print "".join([x for x in res]) print "durée de l'opération: %f sec" %(time.time()-t0) else: print "Usage: ./channel.py <chemin_archive> <fichier_depart> " sys.quit()if "__main__" == __name__ : start()