Revision 326438313332 () - Diff

Link to this snippet: https://friendpaste.com/1EHdO38p7edFDOxxAHDOQ8
Embed:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
641
65
66
67
68
69
701
71
#! /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 <chemin_archive> <fichier_depart> "
sys.quit()

if "__main__" == __name__ :
start()