Чтение двух текстовых файлов построчно
У меня есть два текстовых файла на двух разных языках, и они выровнены построчно. Т.е. первая строка в textfile1 соответствует первой строке в textfile2, и так далее, и тому подобное.
Есть ли способ читать оба файла построчно одновременно?
Ниже приведен пример того, как должны выглядеть файлы. Представьте, что количество строк в файле составляет около 1 000 000.
textfile1:
This is a the first line in English
This is a the 2nd line in English
This is a the third line in English
textfile2:
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 не использует bufferedreader, который читает построчно. Так как бы это было сделано?
Ответы
Ответ 1
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
.
Ответ 2
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
Ответ 3
Python позволяет читать строки за строкой, и это даже поведение по умолчанию - вы просто перебираете файл, как бы перебираете список.
wrt/iterating по двум итерам одновременно, 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())
Ответ 4
Мы могли бы использовать 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))
Замечания:
- Это код
python 3
. Для python 2
используйте itertools.izip
как говорили другие. -
zip
остановится после итерации самого короткого файла, используйте itertools.zip_longest
если это имеет значение.