2つの異なる言語の2つのテキストファイルがあり、それらは行ごとに配置されています。つまり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の行ごとに2つのテキストファイルを同時に読み込む-Java がありますが、Pythonはbufferedreaderを使用しません。行ごとに読み取ります。
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
を使用。
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
Pythonでは、行ごとに読み取ることができます。これはデフォルトの動作です。リストを反復するように、ファイルを反復するだけです。
wrt /一度に2つの反復可能要素を反復処理する場合、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())
ファイルを開くのに便利な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
重要な場合。