sezina sezina - 1 year ago 70
Python Question

Read lines containing integers from a file in Python?

I have a file format like this:

9 8 1
3 4 1

Now, I want to get each line as three integers.

When I used

for line in f.readlines():
print line.split(" ")

The script printed this:

['9', '8', '1\r\n']
['3', '4', '1\r\n']

How can I get each line as three integers?

Answer Source

Using the code you have and addressing your specific question of how to convert your list to integers:

You can iterate through each line and convert the strings to int with the following example using list comprehension:


line =['3', '4', '1\r\n']


int_list = [int(i) for i in line]

will yield a list of integers

[3, 4, 1]

that you can then access via subscripts (0 to 2). e.g.

int_list[0] contains 3,

int_list[1] contains 4,


A more streamlined version for your consideration:

with open('data.txt') as f:
    for line in f:
        int_list = [int(i) for i in line.split()]
        print int_list

The advantage of using with is that it will automatically close your file for you when you are done, or if you encounter an exception.


Based on your comments below, if you want the numbers in 3 different variables, say a, b and c, you can do the following:

   for line in f:
       a, b, c = [int(i) for i in line.split()]
       print 'a = %d, b = %d, c = %d\n' %(a, b, c)

and get this:

    a = 9, b = 8, c = 1

This counts on there being 3 numbers on each line.


Note that in place of "list comprehension" (LC) you can also use a "generator expression" (GE) of this form:

    a, b, c = (int(i) for i in line.split())

for your particular problem with 3 integers this doesn't make much difference, but I show it for completeness. For larger problems, LC requires more memory as it generates a complete list in memory at once, while GE generate a value one by one as needed. This SO question Generator Expressions vs. List Comprehension will give you more information if you are curious.