#! /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, zipfile root = '/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, res def 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 " sys.quit() if "__main__" == __name__ : start()