Чтение двух текстовых файлов построчно одновременно

У меня есть два текстовых файла на двух разных языках, и они выровнены построчно. т.е. первая строка в текстовом файле1 соответствует первой строке в текстовом файле2, и так далее и тому подобное.

Есть ли способ читать оба файла построчно одновременно?

Ниже приведен пример того, как должны выглядеть файлы, представьте, что количество строк в файле составляет около 1 000 000.

текстовый файл1:

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

текстовый файл2:

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

желаемый результат

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

Существует Java-версия этого Одновременное чтение двух текстовых файлов построчно -java, но Python не использует буферизованный считыватель, который читает строку за строкой. Итак, как это сделать?


person alvas    schedule 02.07.2012    source источник
comment
Это не Python, но если вам просто нужен вывод в новом файле, paste textfile1 textfile2 > output тоже подойдет.   -  person eumiro    schedule 02.07.2012
comment
Если вам нравится ответ Ларсмана, вы можете отметить его как принятый.   -  person Noctis Skytower    schedule 02.07.2012


Ответы (4)


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))

В Python 3 замените itertools.izip на встроенный zip.

person Fred Foo    schedule 02.07.2012
comment
Я получаю проблему: Файл MergeANNOVARResults.py, строка 10 с open(refseq) как refseq_fh, open(gencode) как gencode_fh: ^ SyntaxError: неверный синтаксис - person jmtoung; 23.02.2014
comment
Будет ли это загружать весь textfile1 и textfile2 в память? - person user58925; 18.09.2018

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()))

вывод:

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
person Ashwini Chaudhary    schedule 02.07.2012
comment
Имейте в виду, что zip() загрузит все содержимое обоих файлов в память (в Python 2.x). - person Hugh Bothwell; 02.07.2012
comment
Лучше использовать from itertools import izip или izip_longest. - person Martijn Pieters; 02.07.2012

Мы могли бы использовать generator для более удобного открытия файлов, и он мог бы легко поддерживать итератор для большего количества файлов одновременно.

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]))

Примечание.

  1. Это код python 3. Для python 2 используйте itertools.izip, как говорили другие люди.
  2. zip остановится после повторения самого короткого файла, используйте itertools.zip_longest, если это имеет значение.
person YU Chang    schedule 23.05.2019

Python позволяет вам читать строку за строкой, и это даже поведение по умолчанию — вы просто перебираете файл, как перебираете список.

Что касается перебора двух итераций одновременно, itertools.izip — ваш друг:

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())
person bruno desthuilliers    schedule 02.07.2012