Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.python > #104046
| From | MRAB <python@mrabarnett.plus.com> |
|---|---|
| Newsgroups | comp.lang.python |
| Subject | Re: Lookahead while doing: for line in fh.readlines(): |
| Date | 2016-03-04 18:36 +0000 |
| Message-ID | <mailman.195.1457116569.20602.python-list@python.org> (permalink) |
| References | <narqnp$4bm$1@dont-email.me> <mailman.170.1456573604.20994.python-list@python.org> <nbc0uf$b3m$1@dont-email.me> |
On 2016-03-04 13:04, Veek. M wrote:
> Terry Reedy wrote:
>
>> On 2/27/2016 4:39 AM, Veek. M wrote:
>>> I want to do something like:
>>>
>>> #!/usr/bin/env python3
>>>
>>> fh = open('/etc/motd')
>>> for line in fh.readlines():
>>> print(fh.tell())
>>>
>>> why doesn't this work as expected.. fh.readlines() should return a
>>> generator object and fh.tell() ought to start at 0 first.
>>
>> Not after you have already read some data. Readlines() reads the
>> entire
>> file and splits it into lines. readline reads at least a single
>> block.
>> Reading a single byte or character at a time looking for /n would be
>> too slow, so even after readline, the file pointer will be somewhere
>> past the end of the last line returned.
>>
>>> Instead i get the final count repeated for the number of lines.
>>>
>>> What i'm trying to do is lookahead:
>>> #!whatever
>>>
>>> fh = open(whatever)
>>> for line in fh.readlines():
>>> x = fh.tell()
>>> temp = fh.readline()
>>> fh.seek(x)
>>>
>>
>>
>
> I get that readlines() would slurp the whole file for efficiency
> reasons. Why doesn't fh.seek() work though. Object 'fh' is a data
> structure for the OS file descriptor similar to FILE in C.
> <class '_io.TextIOWrapper'>
>
> So if seek works in C, how come it doesn't work in python wrt
> readlines() which is just a method. What obviates the functioning of
> seek wrt readlines()?
>
> fh.tell() works at the line level.. and fh.readline() works with
> fh.seek(0)
>
fh.readlines() reads the entire file.
At this point, it's at the end of the file.
The 'body' of the 'for' loop is then executed.
fh.tell() returns the the position of the end of the file because it's
at the end of the file.
fh.readline() returns an empty string because it's at the end of the file.
fh.seek(x) seeks to the end of the file, which is where it already is.
Is that clearer?
Back to comp.lang.python | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Lookahead while doing: for line in fh.readlines(): "Veek. M" <vek.m1234@gmail.com> - 2016-02-27 15:09 +0530
Re: Lookahead while doing: for line in fh.readlines(): Terry Reedy <tjreedy@udel.edu> - 2016-02-27 06:46 -0500
Re: Lookahead while doing: for line in fh.readlines(): "Veek. M" <vek.m1234@gmail.com> - 2016-03-04 18:34 +0530
Re: Lookahead while doing: for line in fh.readlines(): MRAB <python@mrabarnett.plus.com> - 2016-03-04 18:36 +0000
Re: Lookahead while doing: for line in fh.readlines(): "Veek. M" <vek.m1234@gmail.com> - 2016-03-05 09:01 +0530
csiph-web