Mailing List Archive

io.TextIOWrapper.readlines
Hi folks,

import io

with io.open(filename, ‘r’) as fd:
lines = fd.readlines(hint=1000)
for line in lines:
# do something


I was just looking at the io module. io.open(‘file’, ‘r') returns an io.TextIOWrapper object, which has the io.TextIOWrapper.readlines(hint=-1/) method.


>>> help(io.TextIOWrapper.readlines)
readlines(self, hint=-1, /)
Return a list of lines from the stream.

hint can be specified to control the number of lines read: no more
lines will be read if the total size (in bytes/characters) of all
lines so far exceeds hint.

I haven’t verified this, but that looks like it isn’t reading the entire file. With hint=1000, the method returns as many complete lines that consume less than 1000 bytes of the stream. I’m lazy. Didn’t test it. Seems like only 1000 bytes would be read from the file, rather than the entire file?

The builtin ‘open’ function is defined in the io streams module. I presume the builtin open(‘file’, ‘r’) returns an io.TextIOWrapper object. And maybe the readlines method just isn’t documented?

Just curious and lazy.

thanks,
Karen
--
https://mail.python.org/mailman/listinfo/python-list
Re: io.TextIOWrapper.readlines [ In reply to ]
On 11Nov2020 21:26, Karen Shaeffer <klsshaeffer@icloud.com> wrote:
>import io
>
>with io.open(filename, ‘r’) as fd:
> lines = fd.readlines(hint=1000)
> for line in lines:
> # do something
>
>
>I was just looking at the io module. io.open(‘file’, ‘r') returns an io.TextIOWrapper object, which has the io.TextIOWrapper.readlines(hint=-1/) method.
>
>
>>>> help(io.TextIOWrapper.readlines)
>readlines(self, hint=-1, /)
> Return a list of lines from the stream.
>
> hint can be specified to control the number of lines read: no more
> lines will be read if the total size (in bytes/characters) of all
> lines so far exceeds hint.
>
>I haven’t verified this, but that looks like it isn’t reading the entire file. With hint=1000, the method returns as many complete lines that consume less than 1000 bytes of the stream. I’m lazy. Didn’t test it. Seems like only 1000 bytes would be read from the file, rather than the entire file?

Test it. To my eye, I also think that is what it means.

>The builtin ‘open’ function is defined in the io streams module. I presume the builtin open(‘file’, ‘r’) returns an io.TextIOWrapper object.

Test it:

>>> open('/dev/null','r')
<_io.TextIOWrapper name='/dev/null' mode='r' encoding='UTF-8'>

> And maybe the readlines method just isn’t documented?

It is documented though.

The docs for io.TextIOWrapper start with this (from the 3.8.0 docs I
have handy):

A buffered text stream over a BufferedIOBase binary stream. It
inherits TextIOBase.

The docs for io.TextIOBase start with this:

Base class for text streams. This class provides a character and
line based interface to stream I/O. It inherits IOBase.

And the docs for IOBase has the readlines method with the signature you
describe from its help.

Nte that if I look at the readlines from TextIOWrapper it says:

>>> open('/dev/null','r').readlines
<built-in method readlines of _io.TextIOWrapper object at 0x10b90ae10>

which probably means TextIOWrapper is a C implementation (for
performance), not doing the plain old class inheritance you'd get from a
pure Python implementation.

Cheers,
Cameron Simpson <cs@cskk.id.au>
--
https://mail.python.org/mailman/listinfo/python-list