2017-04-08 1 views
0

Je dois supprimer les caractères de nouvelle ligne dans un fichier énorme f Je suis en train d'analyser deux lignes à la fois. par exemple. comme ça.Python: Analyser plusieurs lignes dans une boucle for avec str.rstrip() en utilisant des générateurs

def foo(f): 
    with open(f, "r") as f: 
    for n, s in zip(f, f): 
     #something with `n` and `s` 

Est-il possible de str.rstrip directement dans la ligne de boucle for ou ai-je besoin de le faire séparément dans le corps de la boucle for. Cela ne fonctionne pas for n, s in zip(f.rstrip(), f.rstrip()):

(Question mise à jour pour le rendre plus concis)

MISE À JOUR:

Ces solutions de la réponse de Barmar et commentaires de PaulCornelius ci-dessous:

def foo2(f): 
    with open(f, "r") as f: 
    for n, s in zip ((line.rstrip() for line in f), (line.rstrip() for line in f)): 
     #Do something with `n` and `s` 

et

def foo3(f): 
    with open(f, "r") as f: 
    g = (line.rstrip() for line in f) 
    for n, s in zip(g, g): 
     #Do something with `n` and `s` 

MISE À JOUR 2:

Si vous souhaitez analyser plusieurs fichiers, on peut faire un générateur par fichier (ici deux fichiers):

def foo4(f1, f2): 
    with open(f1, "r") as f1, open(f2, "r") as f2: 
    g1, g2 = (line.rstrip() for line in f1), (line.rstrip() for line in f2) 
    for n1, s1, n2, s2 in zip(g1, g1, g2, g2): 
     #Do something with `n1`, `s2, `n2` and `s2` 

Répondre

1

Vous pouvez utiliser la liste compréhensions.

for n1, n2 in zip([line.rstrip() for line in f1], [line.rstrip() for line in f1]): 

Mais cela ne traite pas le fichier deux lignes à la fois. Chaque compréhension de liste traite le fichier entier, donc n1 et n2 seront des copies des mêmes lignes.

Je pense que vous pouvez obtenir ce que vous voulez en utilisant une expression à la place du générateur, car ils sont paresseux:

for n1, n2 in zip ((line.rstrip() for line in f1), (line.rstrip() for line in f1)): 
+0

Ah - nice. Serait-ce plus efficace qu'une ligne dans le corps? – user3375672

+1

Probablement à peu près la même chose. – Barmar

+0

OP n'avait pas l'intention d'utiliser deux lignes de 'f1' au lieu d'une de' f1' et une autre de 'f2'? – gyre