简体   繁体   中英

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?

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']

因为readlines读取了文件中的所有行,所以没有f.seek(0)行要读取,再次读取文件时,可以使用f.seek(0)返回开头并从那里开始读取。

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM