Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 415
sezina Avatar asked Jul 06 '12 00:07

sezina


2 Answers

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:

Given:

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

then:

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,

etc.


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.

UPDATE:

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.

Aside:

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.

like image 104
Levon Avatar answered Sep 21 '22 09:09

Levon


with open("myfile.txt") as f:
    for line in f:
        int_list = [int(x) for x in line.split()]

You don't say what you want to do with the list of integers, there may be a better way to iterate over them, depending.

If you "need the values as three different variables," then"

a, b, c = int_list

though you could also use:

int_list[0]
int_list[1]
int_list[2]

as desired.

like image 44
Ned Batchelder Avatar answered Sep 21 '22 09:09

Ned Batchelder