2012-07-02 16 views
32

Tôi có 2 textfiles bằng hai ngôn ngữ khác nhau và chúng được căn chỉnh theo từng dòng. I E. dòng đầu tiên trong textfile1 phải bằng với dòng đầu tiên trong textfile2, v.v.Đọc hai dòng văn bản theo dòng đồng thời -python

Có cách nào để đọc cả hai tệp cùng một lúc không?

Dưới đây là ví dụ về cách các tệp trông như thế nào, hãy tưởng tượng số lượng dòng trên mỗi tệp là khoảng 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 

đầu ra mong muốn

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 

Có một phiên bản java của Read two textfile line by line simultaneously -java này, nhưng trăn không sử dụng BufferedReader mà đọc dòng theo từng dòng. Vậy làm thế nào nó sẽ được thực hiện?

+3

Đây không phải là Python, nhưng nếu bạn chỉ cần đầu ra trong một tập tin mới, 'dán textfile1 textfile2> output' cũng nên làm việc. – eumiro

+0

Nếu bạn thích câu trả lời của larsmans, bạn có thể muốn đánh dấu nó là đã được chấp nhận. –

Trả lời

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

Trong Python 3, thay thế itertools.izip với built-in zip.

+0

Cảm ơn, nó làm việc như một nét duyên dáng – alvas

+0

tôi nhận được vấn đề: File "MergeANNOVARResults.py", dòng 10 với mở (RefSeq) như refseq_fh, mở (gencode) như gencode_fh: ^ Lỗi Cú pháp: cú pháp không hợp lệ – 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())) 

đầu ra:

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

Hãy lưu ý rằng zip() sẽ kéo toàn bộ nội dung của cả hai tệp vào bộ nhớ (bằng Python 2.x) –

+0

Sử dụng tốt hơn ['từ itertools import izip'] (http://docs.python.org/library/itertools. html # itertools.izip) hoặc ['izip_longest'] (http://docs.python.org/library/itertools.html#itertools.izip_longest). –

+2

+1 cho việc sử dụng 'with'. –

3

Python cho phép bạn đọc từng dòng và thậm chí là hành vi mặc định - bạn chỉ cần lặp qua tệp như sẽ lặp qua danh sách.

wrt/iterating hơn hai iterables cùng một lúc, itertools.izip là bạn của bạn:

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