Svavinsky
Svavinsky

Reputation: 79

Why does readline() not work after readlines()?

In Python, say I have:

f = open("file.txt", "r")
    a = f.readlines()
    b = f.readline()
    print a
    print b

print a will show all the lines of the file and print b will show nothing.

Similarly vice versa:

f = open("file.txt", "r")
    a = f.readline()
    b = f.readlines()
    print a
    print b

print a shows the first line but print b will show all lines except the first one.

If both a and b are readlines(), a will show all the lines and b will show nothing.

Why does this happen? Why can't both commands work independently of each other? Is there a workaround for this?

Upvotes: 2

Views: 2283

Answers (3)

U2EF1
U2EF1

Reputation: 13289

Files have a byte offset which is updated whenever you read or write them. This will do what you initially expected:

with open("file.txt") as f:
    a = f.readlines()
    f.seek(0)  # seek to the beginning of the file
    b = f.readline()

Now a is all the lines and b is just the first line.

Upvotes: 1

Taku
Taku

Reputation: 33754

Because readlines read all the lines in the file, so there's no more lines left to read, to read the file again, you can use f.seek(0) to go back to the beginning and read from there.

Upvotes: 3

shad0w_wa1k3r
shad0w_wa1k3r

Reputation: 13373

Because doing .readlines() first will consume all of the read buffer leaving nothing behind for .readline() to fetch from. If you want to go back to the start, use .seek(0) as @abccd already mentioned in his answer.

>>> from StringIO import StringIO
>>> buffer = StringIO('''hi there
... next line
... another line
... 4th line''')
>>> buffer.readline()
'hi there\n'
>>> buffer.readlines()
['next line\n', 'another line\n', '4th line']
>>> buffer.seek(0)
>>> buffer.readlines()
['hi there\n', 'next line\n', 'another line\n', '4th line']

Upvotes: 5

Related Questions