web-dev-qa-db-fra.com

Lecture simultanée de deux fichiers texte ligne par ligne

J'ai deux fichiers texte dans deux langues différentes et ils sont alignés ligne par ligne. C'est à dire. la première ligne du fichier texte1 correspond à la première ligne du fichier texte2, et ainsi de suite.

Existe-t-il un moyen de lire les deux fichiers ligne par ligne simultanément?

Vous trouverez ci-dessous un exemple de l'apparence des fichiers, imaginez que le nombre de lignes par fichier est d'environ 1 000 000.

fichier texte1:

This is a the first line in English
This is a the 2nd line in English
This is a the third line in English

fichier texte2:

C'est la première ligne en Français
C'est la deuxième ligne en Français
C'est la troisième ligne en Français

sortie désirée

This is a the first line in English\tC'est la première ligne en Français
This is a the 2nd line in English\tC'est la deuxième ligne en Français
This is a the third line in English\tC'est la troisième ligne en Français

Il existe une Java de cette Lire deux fichiers texte ligne par ligne simultanément -Java , mais Python n'utilise pas de tampon de lecture qui lit ligne par ligne. Alors comment procéder?

49
alvas
from itertools import izip

with open("textfile1") as textfile1, open("textfile2") as textfile2: 
    for x, y in izip(textfile1, textfile2):
        x = x.strip()
        y = y.strip()
        print("{0}\t{1}".format(x, y))

Dans Python 3, remplacez itertools.izip avec le Zip intégré.

91
Fred Foo
with open(file1) as f1, open(fil2) as f2:
  for x, y in Zip(f1, f2):
     print("{0}\t{1}".format(x.strip(), y.strip()))

sortie:

This is a the first line in English C'est la première ligne en Français
This is a the 2nd line in English   C'est la deuxième ligne en Français
This is a the third line in English C'est la troisième ligne en Français
16
Ashwini Chaudhary

Python vous permet de lire ligne par ligne, et c'est même le comportement par défaut - vous parcourez simplement le fichier comme vous le feriez sur une liste.

écrit/itérant sur deux itérables à la fois, itertools.izip est votre ami:

from itertools import izip
fileA = open("/path/to/file1")
fileB = open("/path/to/file2")
for lineA, lineB in izip(fileA, fileB):
    print "%s\t%s" % (lineA.rstrip(), lineB.rstrip())
3

Nous pourrions utiliser generator pour une ouverture de fichier plus pratique, et il pourrait facilement prendre en charge l'itérateur sur plusieurs fichiers simultanément.

filenames = ['textfile1', 'textfile2']

def gen_line(filename):
    with open(filename) as f:
        for line in f:
            yield line.strip()

gens = [gen_line(n) for n in filenames]

for file1_line, file2_line in Zip(*gens):
    print("\t".join(file1_line, file2_line))

Remarque:

  1. C'est python 3 code. Pour python 2, utilisation itertools.izip comme d'autres l'ont dit.
  2. Zip s'arrêterait après l'itération du fichier le plus court, utilisez itertools.Zip_longest si c'est important.
1
YU Chang