im following along in this nifty little book and one of the coding examples just sparked my interest.

data = open('some_file.txt')
for each_line in data:
    print(each_line)

How does python know what i want it to do without really telling it?
i figured i would have to tell it how i wanted it to print the lines, like parse through each line of the file or something. But it just prints out each line. Like it knew that when i called my variable each_line it understood
so what am i missing? am i over thinking this?

In python, a file opened for reading supports the 'iterable protocol', it means that it can behave like a sequence of items, each item being a line of the file. For example it could be transformed into a list of lines

L = list(open('spam.txt'))

It can also be used in a for statement, like a list, tuple or any 'iterable'. The name of the loop variable does not have a special meaning. One could write

data = open('some_file.txt')
for foobarbazqux in data:
    print(foobarbazqux)

Edited 4 Years Ago by Gribouillis

Exactly. It reads line by line if it is used like an iterable. The other way to read is to use data.read(), or data.read(number).

Edited 4 Years Ago by Gribouillis

You can quickly test these things out:

data_text = """\
one
two
three
"""

# write the data text to a text file
fname = "mydata1.txt"
with open(fname, "w") as fout:
    fout.write(data_text)

# read data back in as a text string
# the with block will close the file for you
with open(fname) as fin:
    text_str = fin.read()

print(text_str)

'''result>>>
one
two
three
'''

# read the file back in as a list (retains newline char)
with open(fname) as fin:
    data_list = fin.readlines()

print(data_list)

'''result>>>
['one\n', 'two\n', 'three\n']
'''

# read the file back in as a list and remove the extra newline characters
data_list1 = []
for line in open(fname):
    line = line.strip()
    data_list1.append(line)

print(data_list1)

'''result>>>
['one', 'two', 'three']
'''
This article has been dead for over six months. Start a new discussion instead.