je cherche à traduire un script VB en Python qui utilise la méthode
Peek() dans une boucle de parcours d'un fichier.
Cette méthode permet de savoir qu'il y a encore des données à lire avant
de les lire. C'est une sorte de «not EOF».
J'ai trouvé deux possibilités, mais ça ne m'emballe pas trop :
1) f = open("monfichier", "rU")
f.seek(0,2)
eof = f.tell()
f.seek(0,0)
while f.tell() != eof
...
Ça me semble un peu bidouille.
2) construire un itérateur d'après le CookBook
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/304373
Celle là me paraît un peu «usine à gaz»
En fait je ne peux pas boucler avec un «for i in f.readlines()» car j'ai
besoin de lire plusieurs lignes par itération. Une sorte
d'enregistrement en fait.
Mon fichier contient en effet un nombre inconnu de données de la forme :
Nom du fichier : MAESCOM
Moyenne : 22200
Min : 2244
Max : 26052
Nombre : 7
Nom du fichier : INTCHARGER
Moyenne : 23727
Min : 23700
Max : 23764
Nombre : 58
Nom du fichier : GENERECH
Moyenne : 24107
Min : 24000
Max : 24240
Nombre : 163
Je me dis qu'il doit y avoir un moyen plus élégant de procéder que ce
que j'ai trouvé. Un petit coup de pouce ?
Merci.
PS: concernant le fonctionnement de Peek() si vous avez un équivalent,
je serai quand même curieux de le connaître.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
F. Petitjean
Bonjour,
je cherche à traduire un script VB en Python qui utilise la méthode Peek() dans une boucle de parcours d'un fichier.
Cette méthode permet de savoir qu'il y a encore des données à lire avant de les lire. C'est une sorte de «not EOF».
Pourquoi vouloir "traduire" en Python un concept d'un autre langage ?
En fait je ne peux pas boucler avec un «for i in f.readlines()» car j'ai besoin de lire plusieurs lignes par itération. Une sorte d'enregistrement en fait.
Mon fichier contient en effet un nombre inconnu de données de la forme : Nom du fichier : MAESCOM Moyenne : 22200 Min : 2244 Max : 26052 Nombre : 7 Nom du fichier : INTCHARGER Moyenne : 23727 Min : 23700 Max : 23764 Nombre : 58 Nom du fichier : GENERECH Moyenne : 24107 Min : 24000 Max : 24240 Nombre : 163
Je me dis qu'il doit y avoir un moyen plus élégant de procéder que ce que j'ai trouvé. Un petit coup de pouce ?
Je suppose que vous avez un interpréteur Python pas trop ancien, disons une version au moins 2.3.x fin = open(fname) itfin = iter(fin)
et en mode interactif tapez itfin is fin itfin == fin
si vous avez True ou 1 comme réponse vous avez gagné, vous pouvez lire ligne à ligne avec for (for line in itfin:) ou en utilisant itfin.next() qui est en fait un readline() avec levée de StopIteration s'il n'y a plus rien à lire.
lnext = itfin.next # chaque appel de lnext() donne une ligne ou StopIteration
Dans votre cas : for lnomfichier in itfin: nomfichier = lnomfichier.split()[-1] lmoy = lnext() # ligne Moyenne lmin = lnext() # ligne Min lmax = lnext() # ligne Max lnbr = lnext() # ligne Nombre # si vous êtes arrivé ici sans StopIteration c'est que le bloc de # données était OK. Vous pouvez éventuellement mettre les 4 # instructions dans un bloc try: except StopIteration: # raise ValueError("pb avec fichier '%s'" % (fname,))
Pour extraire les valeurs lues sur les lignes, il y aurait bien une possibilité du genre vals = map(int, [ words[-1] for words in line.split() for line in (lmoy, lmin, lmax, lnbr) ]) mais cela me semble suffisamment compliqué et tordu pour contenir des erreurs. Je vous conseille donc de procéder à coup de "list compréhesion" lines = (lmoy, lmin, lmax, lnbr) nbres = [ line.split()[-1] for line in lines ] # en clair vals = map(int, nbres) # en binaire (des entiers)
méthode directe vals = map(int, [line.split()[-1] for line in (lmoy, lmin, lmax, lnbr)]) traitement(nomfichier, vals)
Merci.
PS: concernant le fonctionnement de Peek() si vous avez un équivalent, je serai quand même curieux de le connaître. Essayez d'être "pythonique" sur fr.comp.lang.ppython
Bonjour,
je cherche à traduire un script VB en Python qui utilise la méthode
Peek() dans une boucle de parcours d'un fichier.
Cette méthode permet de savoir qu'il y a encore des données à lire avant
de les lire. C'est une sorte de «not EOF».
Pourquoi vouloir "traduire" en Python un concept d'un autre langage ?
En fait je ne peux pas boucler avec un «for i in f.readlines()» car j'ai
besoin de lire plusieurs lignes par itération. Une sorte
d'enregistrement en fait.
Mon fichier contient en effet un nombre inconnu de données de la forme :
Nom du fichier : MAESCOM
Moyenne : 22200
Min : 2244
Max : 26052
Nombre : 7
Nom du fichier : INTCHARGER
Moyenne : 23727
Min : 23700
Max : 23764
Nombre : 58
Nom du fichier : GENERECH
Moyenne : 24107
Min : 24000
Max : 24240
Nombre : 163
Je me dis qu'il doit y avoir un moyen plus élégant de procéder que ce
que j'ai trouvé. Un petit coup de pouce ?
Je suppose que vous avez un interpréteur Python pas trop ancien, disons
une version au moins 2.3.x
fin = open(fname)
itfin = iter(fin)
et en mode interactif tapez
itfin is fin
itfin == fin
si vous avez True ou 1 comme réponse vous avez gagné, vous pouvez lire
ligne à ligne avec for (for line in itfin:) ou en utilisant itfin.next()
qui est en fait un readline() avec levée de StopIteration s'il n'y a
plus rien à lire.
lnext = itfin.next
# chaque appel de lnext() donne une ligne ou StopIteration
Dans votre cas :
for lnomfichier in itfin:
nomfichier = lnomfichier.split()[-1]
lmoy = lnext() # ligne Moyenne
lmin = lnext() # ligne Min
lmax = lnext() # ligne Max
lnbr = lnext() # ligne Nombre
# si vous êtes arrivé ici sans StopIteration c'est que le bloc de
# données était OK. Vous pouvez éventuellement mettre les 4
# instructions dans un bloc try: except StopIteration:
# raise ValueError("pb avec fichier '%s'" % (fname,))
Pour extraire les valeurs lues sur les lignes, il y aurait bien une
possibilité du genre vals = map(int, [ words[-1] for words in
line.split() for line in (lmoy, lmin, lmax, lnbr) ]) mais cela me semble
suffisamment compliqué et tordu pour contenir des erreurs. Je vous
conseille donc de procéder à coup de "list compréhesion"
lines = (lmoy, lmin, lmax, lnbr)
nbres = [ line.split()[-1] for line in lines ] # en clair
vals = map(int, nbres) # en binaire (des entiers)
méthode directe
vals = map(int, [line.split()[-1] for line in (lmoy, lmin, lmax, lnbr)])
traitement(nomfichier, vals)
Merci.
PS: concernant le fonctionnement de Peek() si vous avez un équivalent,
je serai quand même curieux de le connaître.
Essayez d'être "pythonique" sur fr.comp.lang.ppython
je cherche à traduire un script VB en Python qui utilise la méthode Peek() dans une boucle de parcours d'un fichier.
Cette méthode permet de savoir qu'il y a encore des données à lire avant de les lire. C'est une sorte de «not EOF».
Pourquoi vouloir "traduire" en Python un concept d'un autre langage ?
En fait je ne peux pas boucler avec un «for i in f.readlines()» car j'ai besoin de lire plusieurs lignes par itération. Une sorte d'enregistrement en fait.
Mon fichier contient en effet un nombre inconnu de données de la forme : Nom du fichier : MAESCOM Moyenne : 22200 Min : 2244 Max : 26052 Nombre : 7 Nom du fichier : INTCHARGER Moyenne : 23727 Min : 23700 Max : 23764 Nombre : 58 Nom du fichier : GENERECH Moyenne : 24107 Min : 24000 Max : 24240 Nombre : 163
Je me dis qu'il doit y avoir un moyen plus élégant de procéder que ce que j'ai trouvé. Un petit coup de pouce ?
Je suppose que vous avez un interpréteur Python pas trop ancien, disons une version au moins 2.3.x fin = open(fname) itfin = iter(fin)
et en mode interactif tapez itfin is fin itfin == fin
si vous avez True ou 1 comme réponse vous avez gagné, vous pouvez lire ligne à ligne avec for (for line in itfin:) ou en utilisant itfin.next() qui est en fait un readline() avec levée de StopIteration s'il n'y a plus rien à lire.
lnext = itfin.next # chaque appel de lnext() donne une ligne ou StopIteration
Dans votre cas : for lnomfichier in itfin: nomfichier = lnomfichier.split()[-1] lmoy = lnext() # ligne Moyenne lmin = lnext() # ligne Min lmax = lnext() # ligne Max lnbr = lnext() # ligne Nombre # si vous êtes arrivé ici sans StopIteration c'est que le bloc de # données était OK. Vous pouvez éventuellement mettre les 4 # instructions dans un bloc try: except StopIteration: # raise ValueError("pb avec fichier '%s'" % (fname,))
Pour extraire les valeurs lues sur les lignes, il y aurait bien une possibilité du genre vals = map(int, [ words[-1] for words in line.split() for line in (lmoy, lmin, lmax, lnbr) ]) mais cela me semble suffisamment compliqué et tordu pour contenir des erreurs. Je vous conseille donc de procéder à coup de "list compréhesion" lines = (lmoy, lmin, lmax, lnbr) nbres = [ line.split()[-1] for line in lines ] # en clair vals = map(int, nbres) # en binaire (des entiers)
méthode directe vals = map(int, [line.split()[-1] for line in (lmoy, lmin, lmax, lnbr)]) traitement(nomfichier, vals)
Merci.
PS: concernant le fonctionnement de Peek() si vous avez un équivalent, je serai quand même curieux de le connaître. Essayez d'être "pythonique" sur fr.comp.lang.ppython
Sébastien Kirche
Le 20 avr 2005, F. Petitjean a formulé :
Pourquoi vouloir "traduire" en Python un concept d'un autre langage ?
Parce j'essaie de reprendre des macros VB pour Visual Studio écrite par un collègue (tools et helpers d'écriture de projet) pour les adapter avec Python afin de les réutiliser dans CodeWarrior (je suis le seul développeur exclusif Mac de ma boîte). Et que je ne repars pas de zéro.
(Par contre quand ce sera fait j'espère le mettre au Python sous Win)
Je suppose que vous avez un interpréteur Python pas trop ancien, disons une version au moins 2.3.x
Oui, 2.3... sous OSX.
fin = open(fname) itfin = iter(fin)
et en mode interactif tapez itfin is fin itfin == fin
si vous avez True ou 1 comme réponse vous avez gagné, vous pouvez lire ligne à ligne avec for (for line in itfin:) ou en utilisant itfin.next() qui est en fait un readline() avec levée de StopIteration s'il n'y a plus rien à lire.
lnext = itfin.next # chaque appel de lnext() donne une ligne ou StopIteration
Dans votre cas : for lnomfichier in itfin: nomfichier = lnomfichier.split()[-1] lmoy = lnext() # ligne Moyenne lmin = lnext() # ligne Min lmax = lnext() # ligne Max lnbr = lnext() # ligne Nombre # si vous êtes arrivé ici sans StopIteration c'est que le bloc de # données était OK. Vous pouvez éventuellement mettre les 4 # instructions dans un bloc try: except StopIteration: # raise ValueError("pb avec fichier '%s'" % (fname,))
Ok, merci.
Pour extraire les valeurs lues sur les lignes, il y aurait bien une possibilité du genre vals = map(int, [ words[-1] for words in line.split() for line in (lmoy, lmin, lmax, lnbr) ]) mais cela me semble suffisamment compliqué et tordu pour contenir des erreurs. Je vous conseille donc de procéder à coup de "list compréhesion" lines = (lmoy, lmin, lmax, lnbr) nbres = [ line.split()[-1] for line in lines ] # en clair vals = map(int, nbres) # en binaire (des entiers)
Pas mal. Les list comprehension j'ai déjà testé pour avoir les fichiers d'une extension donnée dans un répertoire : je trouve ça excellent.
méthode directe vals = map(int, [line.split()[-1] for line in (lmoy, lmin, lmax, lnbr)]) traitement(nomfichier, vals)
[...] Essayez d'être "pythonique" sur fr.comp.lang.ppython
Je ne demande pas mieux. Merci de m'y aider.
-- Sébastien Kirche
Le 20 avr 2005, F. Petitjean a formulé :
Pourquoi vouloir "traduire" en Python un concept d'un autre langage ?
Parce j'essaie de reprendre des macros VB pour Visual Studio écrite par
un collègue (tools et helpers d'écriture de projet) pour les adapter
avec Python afin de les réutiliser dans CodeWarrior (je suis le seul
développeur exclusif Mac de ma boîte). Et que je ne repars pas de zéro.
(Par contre quand ce sera fait j'espère le mettre au Python sous Win)
Je suppose que vous avez un interpréteur Python pas trop ancien,
disons une version au moins 2.3.x
Oui, 2.3... sous OSX.
fin = open(fname) itfin = iter(fin)
et en mode interactif tapez
itfin is fin
itfin == fin
si vous avez True ou 1 comme réponse vous avez gagné, vous pouvez lire
ligne à ligne avec for (for line in itfin:) ou en utilisant
itfin.next() qui est en fait un readline() avec levée de StopIteration
s'il n'y a plus rien à lire.
lnext = itfin.next
# chaque appel de lnext() donne une ligne ou StopIteration
Dans votre cas :
for lnomfichier in itfin:
nomfichier = lnomfichier.split()[-1]
lmoy = lnext() # ligne Moyenne
lmin = lnext() # ligne Min
lmax = lnext() # ligne Max
lnbr = lnext() # ligne Nombre
# si vous êtes arrivé ici sans StopIteration c'est que le bloc de
# données était OK. Vous pouvez éventuellement mettre les 4
# instructions dans un bloc try: except StopIteration:
# raise ValueError("pb avec fichier '%s'" % (fname,))
Ok, merci.
Pour extraire les valeurs lues sur les lignes, il y aurait bien une
possibilité du genre vals = map(int, [ words[-1] for words in
line.split() for line in (lmoy, lmin, lmax, lnbr) ]) mais cela me
semble suffisamment compliqué et tordu pour contenir des erreurs. Je
vous conseille donc de procéder à coup de "list compréhesion"
lines = (lmoy, lmin, lmax, lnbr)
nbres = [ line.split()[-1] for line in lines ] # en clair
vals = map(int, nbres) # en binaire (des entiers)
Pas mal. Les list comprehension j'ai déjà testé pour avoir les fichiers
d'une extension donnée dans un répertoire : je trouve ça excellent.
méthode directe vals = map(int, [line.split()[-1] for line in (lmoy,
lmin, lmax, lnbr)]) traitement(nomfichier, vals)
[...]
Essayez d'être "pythonique" sur fr.comp.lang.ppython
Pourquoi vouloir "traduire" en Python un concept d'un autre langage ?
Parce j'essaie de reprendre des macros VB pour Visual Studio écrite par un collègue (tools et helpers d'écriture de projet) pour les adapter avec Python afin de les réutiliser dans CodeWarrior (je suis le seul développeur exclusif Mac de ma boîte). Et que je ne repars pas de zéro.
(Par contre quand ce sera fait j'espère le mettre au Python sous Win)
Je suppose que vous avez un interpréteur Python pas trop ancien, disons une version au moins 2.3.x
Oui, 2.3... sous OSX.
fin = open(fname) itfin = iter(fin)
et en mode interactif tapez itfin is fin itfin == fin
si vous avez True ou 1 comme réponse vous avez gagné, vous pouvez lire ligne à ligne avec for (for line in itfin:) ou en utilisant itfin.next() qui est en fait un readline() avec levée de StopIteration s'il n'y a plus rien à lire.
lnext = itfin.next # chaque appel de lnext() donne une ligne ou StopIteration
Dans votre cas : for lnomfichier in itfin: nomfichier = lnomfichier.split()[-1] lmoy = lnext() # ligne Moyenne lmin = lnext() # ligne Min lmax = lnext() # ligne Max lnbr = lnext() # ligne Nombre # si vous êtes arrivé ici sans StopIteration c'est que le bloc de # données était OK. Vous pouvez éventuellement mettre les 4 # instructions dans un bloc try: except StopIteration: # raise ValueError("pb avec fichier '%s'" % (fname,))
Ok, merci.
Pour extraire les valeurs lues sur les lignes, il y aurait bien une possibilité du genre vals = map(int, [ words[-1] for words in line.split() for line in (lmoy, lmin, lmax, lnbr) ]) mais cela me semble suffisamment compliqué et tordu pour contenir des erreurs. Je vous conseille donc de procéder à coup de "list compréhesion" lines = (lmoy, lmin, lmax, lnbr) nbres = [ line.split()[-1] for line in lines ] # en clair vals = map(int, nbres) # en binaire (des entiers)
Pas mal. Les list comprehension j'ai déjà testé pour avoir les fichiers d'une extension donnée dans un répertoire : je trouve ça excellent.
méthode directe vals = map(int, [line.split()[-1] for line in (lmoy, lmin, lmax, lnbr)]) traitement(nomfichier, vals)
[...] Essayez d'être "pythonique" sur fr.comp.lang.ppython
Je ne demande pas mieux. Merci de m'y aider.
-- Sébastien Kirche
Amaury Forgeot d'Arc
Bonjour, ...
En fait je ne peux pas boucler avec un «for i in f.readlines()» car j'ai besoin de lire plusieurs lignes par itération. Une sorte d'enregistrement en fait.
Mon fichier contient en effet un nombre inconnu de données de la forme : Nom du fichier : MAESCOM Moyenne : 22200 Min : 2244 Max : 26052 Nombre : 7
S'il suffit de lire les lignes 5 par 5, on peut le faire assez élégamment, avec un générateur:
def getmany(iterable, count): while True: yield [iterable.next() for i in range(count)]
Il s'utilise ainsi:
f = open("monfichier", "rU") for bloc in getmany(f, 5): ...bloc contient les 5 lignes...
Si le nombre de lignes n'est pas un multiple de 5, les dernières sont ignorées. Pour les obtenir, c'est un peu plus compliqué:
def getmany( iterable, count ): while True: ret = () try: for i in range(count): ret += (iterable.next(),) except StopIteration: # Fin du fichier atteinte if ret: yield ret return yield ret
Amaury
Bonjour,
...
En fait je ne peux pas boucler avec un «for i in f.readlines()» car j'ai
besoin de lire plusieurs lignes par itération. Une sorte
d'enregistrement en fait.
Mon fichier contient en effet un nombre inconnu de données de la forme :
Nom du fichier : MAESCOM
Moyenne : 22200
Min : 2244
Max : 26052
Nombre : 7
S'il suffit de lire les lignes 5 par 5, on peut le faire assez
élégamment, avec un générateur:
def getmany(iterable, count):
while True:
yield [iterable.next() for i in range(count)]
Il s'utilise ainsi:
f = open("monfichier", "rU")
for bloc in getmany(f, 5):
...bloc contient les 5 lignes...
Si le nombre de lignes n'est pas un multiple de 5, les dernières sont
ignorées. Pour les obtenir, c'est un peu plus compliqué:
def getmany( iterable, count ):
while True:
ret = ()
try:
for i in range(count):
ret += (iterable.next(),)
except StopIteration:
# Fin du fichier atteinte
if ret: yield ret
return
yield ret
En fait je ne peux pas boucler avec un «for i in f.readlines()» car j'ai besoin de lire plusieurs lignes par itération. Une sorte d'enregistrement en fait.
Mon fichier contient en effet un nombre inconnu de données de la forme : Nom du fichier : MAESCOM Moyenne : 22200 Min : 2244 Max : 26052 Nombre : 7
S'il suffit de lire les lignes 5 par 5, on peut le faire assez élégamment, avec un générateur:
def getmany(iterable, count): while True: yield [iterable.next() for i in range(count)]
Il s'utilise ainsi:
f = open("monfichier", "rU") for bloc in getmany(f, 5): ...bloc contient les 5 lignes...
Si le nombre de lignes n'est pas un multiple de 5, les dernières sont ignorées. Pour les obtenir, c'est un peu plus compliqué:
def getmany( iterable, count ): while True: ret = () try: for i in range(count): ret += (iterable.next(),) except StopIteration: # Fin du fichier atteinte if ret: yield ret return yield ret
Amaury
Sébastien Kirche
Le 20 avr 2005, Amaury Forgeot d'Arc a dit :
Bonjour, ...
En fait je ne peux pas boucler avec un «for i in f.readlines()» car j'ai besoin de lire plusieurs lignes par itération. Une sorte d'enregistrement en fait. Mon fichier contient en effet un nombre inconnu de données de la forme : Nom du fichier : MAESCOM Moyenne : 22200 Min : 2244 Max : 26052 Nombre : 7
S'il suffit de lire les lignes 5 par 5, on peut le faire assez élégamment, avec un générateur:
def getmany(iterable, count): while True: yield [iterable.next() for i in range(count)]
Il s'utilise ainsi:
f = open("monfichier", "rU") for bloc in getmany(f, 5): ...bloc contient les 5 lignes...
C'est pas mal comme idée, je vais essayer.
Si le nombre de lignes n'est pas un multiple de 5, les dernières sont ignorées.
Dans le cas qui m'intéresse ici, le fichier a été généré automatiquement et il est bien censé contenir n fois ces 5 lignes.
Dans le cas contraire, c'est un bug du générateur (que j'ai aussi refait en Python).
Pour les obtenir, c'est un peu plus compliqué:
def getmany( iterable, count ): while True: ret = () try: for i in range(count): ret += (iterable.next(),) except StopIteration: # Fin du fichier atteinte if ret: yield ret return yield ret
Je prend bonne note de tout ça et je vais tester. Merci.
-- Sébastien Kirche
Le 20 avr 2005, Amaury Forgeot d'Arc a dit :
Bonjour,
...
En fait je ne peux pas boucler avec un «for i in f.readlines()» car
j'ai besoin de lire plusieurs lignes par itération. Une sorte
d'enregistrement en fait. Mon fichier contient en effet un nombre
inconnu de données de la forme : Nom du fichier : MAESCOM Moyenne :
22200 Min : 2244 Max : 26052 Nombre : 7
S'il suffit de lire les lignes 5 par 5, on peut le faire assez
élégamment, avec un générateur:
def getmany(iterable, count):
while True:
yield [iterable.next() for i in range(count)]
Il s'utilise ainsi:
f = open("monfichier", "rU")
for bloc in getmany(f, 5):
...bloc contient les 5 lignes...
C'est pas mal comme idée, je vais essayer.
Si le nombre de lignes n'est pas un multiple de 5, les dernières sont
ignorées.
Dans le cas qui m'intéresse ici, le fichier a été généré automatiquement
et il est bien censé contenir n fois ces 5 lignes.
Dans le cas contraire, c'est un bug du générateur (que j'ai aussi refait
en Python).
Pour les obtenir, c'est un peu plus compliqué:
def getmany( iterable, count ):
while True:
ret = ()
try:
for i in range(count):
ret += (iterable.next(),)
except StopIteration:
# Fin du fichier atteinte
if ret: yield ret
return
yield ret
Je prend bonne note de tout ça et je vais tester. Merci.
En fait je ne peux pas boucler avec un «for i in f.readlines()» car j'ai besoin de lire plusieurs lignes par itération. Une sorte d'enregistrement en fait. Mon fichier contient en effet un nombre inconnu de données de la forme : Nom du fichier : MAESCOM Moyenne : 22200 Min : 2244 Max : 26052 Nombre : 7
S'il suffit de lire les lignes 5 par 5, on peut le faire assez élégamment, avec un générateur:
def getmany(iterable, count): while True: yield [iterable.next() for i in range(count)]
Il s'utilise ainsi:
f = open("monfichier", "rU") for bloc in getmany(f, 5): ...bloc contient les 5 lignes...
C'est pas mal comme idée, je vais essayer.
Si le nombre de lignes n'est pas un multiple de 5, les dernières sont ignorées.
Dans le cas qui m'intéresse ici, le fichier a été généré automatiquement et il est bien censé contenir n fois ces 5 lignes.
Dans le cas contraire, c'est un bug du générateur (que j'ai aussi refait en Python).
Pour les obtenir, c'est un peu plus compliqué:
def getmany( iterable, count ): while True: ret = () try: for i in range(count): ret += (iterable.next(),) except StopIteration: # Fin du fichier atteinte if ret: yield ret return yield ret
Je prend bonne note de tout ça et je vais tester. Merci.
-- Sébastien Kirche
F. Petitjean
Si le nombre de lignes n'est pas un multiple de 5, les dernières sont ignorées. Pour les obtenir, c'est un peu plus compliqué:
def getmany( iterable, count ): it = iter(iterable) # cela en jette d'utiliser iter() :-)
while True: # ret = () ret = [] # avec une liste c'est plus simple
try: for i in range(count): # ret += (iterable.next(),) ret.append(it.next())
except StopIteration: # Fin du fichier atteinte if ret: yield ret return # oui! return et non pas raise qui serait # interprété comme raise None yield ret
Il existe aussi une solution dans le cas où on ne s'intéresse pas au
dernier paquet s'il est incomplet. C'est d'utiliser itertools.izip
from itertools import izip def byN(iterable, N=2): it = iter(iterable) itN = (it,)*N # multiplication d'un tuple ==> (it, it, ...) return izip(*itN)
Si le nombre de lignes n'est pas un multiple de 5, les dernières sont
ignorées. Pour les obtenir, c'est un peu plus compliqué:
def getmany( iterable, count ):
it = iter(iterable) # cela en jette d'utiliser iter() :-)
while True:
# ret = ()
ret = [] # avec une liste c'est plus simple
try:
for i in range(count):
# ret += (iterable.next(),)
ret.append(it.next())
except StopIteration:
# Fin du fichier atteinte
if ret: yield ret
return # oui! return et non pas raise qui serait
# interprété comme raise None
yield ret
Il existe aussi une solution dans le cas où on ne s'intéresse pas au
dernier paquet s'il est incomplet. C'est d'utiliser itertools.izip
from itertools import izip
def byN(iterable, N=2):
it = iter(iterable)
itN = (it,)*N # multiplication d'un tuple ==> (it, it, ...)
return izip(*itN)
Si le nombre de lignes n'est pas un multiple de 5, les dernières sont ignorées. Pour les obtenir, c'est un peu plus compliqué:
def getmany( iterable, count ): it = iter(iterable) # cela en jette d'utiliser iter() :-)
while True: # ret = () ret = [] # avec une liste c'est plus simple
try: for i in range(count): # ret += (iterable.next(),) ret.append(it.next())
except StopIteration: # Fin du fichier atteinte if ret: yield ret return # oui! return et non pas raise qui serait # interprété comme raise None yield ret
Il existe aussi une solution dans le cas où on ne s'intéresse pas au
dernier paquet s'il est incomplet. C'est d'utiliser itertools.izip
from itertools import izip def byN(iterable, N=2): it = iter(iterable) itN = (it,)*N # multiplication d'un tuple ==> (it, it, ...) return izip(*itN)