2012-07-02 80 views
32

我有两种不同语言的2个文本文件,并且它们是逐行对齐的。即textfile1中的第一行应该等于textfile2中的第一行,依此类推。同时读取两个文本文件--python

有没有办法同时读取两个文件的文件?

下面是文件应该是什么样子的示例,想象一下每个文件的行数大约为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 

有这个Read two textfile line by line simultaneously -java的Java版本,但是Python不使用的BufferedReader读取线按行。那么它将如何完成?

+3

这不是Python,但如果你只需要在一个新的文件输出,'粘贴textfile1 textfile2> output'也应该工作。 – eumiro

+0

如果你喜欢larsmans的回答,你可能想把它标记为已接受。 –

回答

64
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

+0

谢谢,它的工作就像一个魅力 – alvas

+0

我得到的问题: 文件 “MergeANNOVARResults.py”,用开(以RefSeq)线10 为refseq_fh,开(gencode)为gencode_fh: ^ 语法错误:无效的语法 – jmtoung

13
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 
+2

请注意,zip()会将两个文件的全部内容拉入内存(在Python 2.x中) –

+0

更好地使用['from itertools import izip'](http://docs.python.org/library/itertools。 html#itertools.izip)或['izip_longest'](http://docs.python.org/library/itertools.html#itertools.izip_longest)。 –

+2

+1虽然使用'与'。 –

3

Python确实让你逐行阅读,它甚至是默认行为 - 你只需遍历文件,就像迭代列表一样。

WRT /迭代过同时做两项iterables,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())