6
votes

Existe-t-il un moyen de lire deux fichiers en même temps à Python? (avec la même boucle?)

J'essaie de lire 2 fichiers en même temps, mais je reçois une "trop ​​de valeurs pour déballer l'erreur". Voici ce que j'ai:

for each_f, each_g in f, g :
    line_f = each_f.split()
    line_g = each_g.split()


0 commentaires

3 Réponses :


8
votes
import itertools

# ...

for each_f, each_g in itertools.izip(f, g):
    # ...

9 commentaires

Importer iTertools pourrait être nécessaire.


Ce n'est peut-être pas évident pour op, d'où le commentaire.


@shahkalpeh Ok, je crois toujours que c'est vraiment évident, mais je vais l'ajouter à ma réponse au cas où ...


Merci pour la modification. Je suis un débutant en python aussi. La même chose peut-elle être obtenue sans utiliser itertools?


@shahkalpeh Oui, mais cela vous oblige à lire manuellement à partir de chacun des fichiers de temps en boucle de While, car une boucle de boucle ne peut itérer sur un seul itérateur à la fois. IZIP fusionne les deux itérateurs en une pour que la boucle de commande puisse fonctionner dessus.


@Kirelagin: En fait, iTertools pourrait être une bonne chose. Juste pensé à vérifier si vous utilisez un tuple, cela peut être fait?


@shahkalpeh non, il ne peut pas être fait en utilisant un tuple. Vous avez besoin d'un générateur d'envelopper une paire de générateurs et d'obtenir suivant à partir de deux en même temps. Vous pouvez y parcourir manuellement, cependant.


Comme @cheppner a noté dans sa réponse izip rompt dès que le court terme des deux fichiers se termine. Quelque chose à garder à l'esprit.


Il y a aussi iziplongest Aucun (ou une valeur spécifiée par l'utilisateur) pour l'itérateur plus court jusqu'à épuisement plus long.



1
votes

Vous pouvez utiliser un gestionnaire de contexte, c'est-à-dire l'instruction avec la lecture de deux fichiers en même temps:

with open('file1', 'r') as a, open('file2', 'r') as b:  
    do_something_with_a_and_b


1 commentaires

Je pense que cela ne devrait pas être évité comme celui-ci; Ceci est une réponse simple au titre de la question, qui n'arrive pas à ne pas coïncider avec le vrai problème. C'est le titre qui devrait être réparé à quelque chose comme trop de valeurs pour déballer pour la boucle



1
votes

sans utiliser iTertools : xxx

ceci sort de la boucle dès que le plus court des deux fichiers est épuisé, comme izip fait aussi.

mais vraiment, iTERTOOLS est la solution supérieure.


0 commentaires