chimeracoder
chimeracoder

Reputation: 21682

How to iterate across lines in two files simultaneously?

I have two files, and I want to perform some line-wise operation across both of them. (In other words, the first lines of each file correspond, as do the second, etc.) Now, I can think of a number of slightly cumbersome ways to iterate across both files simultaneously; however, this is Python, so I imagine that there is some syntactic shorthand.

In other words, is there some simple way to adapt the

for line in file:

so that it pulls data from both files simultaneously?

Upvotes: 26

Views: 19949

Answers (3)

Daniel Roseman
Daniel Roseman

Reputation: 599630

Python 2:

Use itertools.izip to join the two iterators.

from itertools import izip
for line_from_file_1, line_from_file_2 in izip(open(file_1), open(file_2)):

If the files are of unequal length, use izip_longest.

In Python 3, use zip and zip_longest instead. Also, use a with to open files, so that closing is handled automatically even in case of errors.

with open(file1name) as file1, open(file2name) as file2:
    for line1, line2 in zip(file1, file2):
        #do stuff

Upvotes: 46

Alex Bliskovsky
Alex Bliskovsky

Reputation: 6303

You could try

for line1, line2 in zip(file1, file2):
    #do stuff

Careful though, this loop will exit when the shorter file ends.

When using Python 2, itertools.izip is better for this sort of thing because it doesn't create a list.

Upvotes: 10

Ethan Furman
Ethan Furman

Reputation: 69051

A complete example for posterity:

from itertools import izip, izip_longest

file1name = '/some/path/and/file'
file2name = '/another/path/and/another/file'

with open(file1name) as file1, open(file2name) as file2:
    for line1, line2 in izip(file1, file2):   # or izip_longest
        # do something with the lines

Using with ensures the files are cleaned up after use, even if an exception occurs.

Upvotes: 3

Related Questions