[Tutor] New to this
Steven D'Aprano
steve at pearwood.info
Mon Jun 21 02:22:34 CEST 2010
On Mon, 21 Jun 2010 09:02:55 am Alex Hall wrote:
> On 6/20/10, Neil Thorman <neil.thorman at gmail.com> wrote:
[...]
> >>>>inp = file("menu.txt", "r")
> >
> > *What is inp? What does it now contain?*
>
> It is now a reference to the location of the txt file.
[pedantic]
No, it's actually an abstract data structure that wraps the actual file
itself. A reference to the *location* of the file would be:
inp = "menu.txt"
Locations are strings. File objects are file objects.
[/pedantic]
But in a practical sense, pay no attention to the man behind the curtain
(the implementation details). inp is a file in every way which matters,
just like after:
n = 42
x = 1.234
n is an int and x a float in every way which matters.
> Python calls
> these file "objects", where an object is just something on which you
> can call functions. If you had a dog object you might call a "bark"
> method; here, we have a file object, so we can see what the file is.
> inp is not the file itself, just as any object is not the full
> object's info but rather a pointer to where that info is. If you were
> to print inp, I think you would get a memory address.
You would get a string printed to the console, like printing *anything*.
>>> print inp
<open file 'foo', mode 'w' at 0xb7d3a250>
That string happens to contain a hex number which looks like it could be
a memory address, but that's an implementation detail because CPython
doesn't sufficiently abstract its objects from the underlying C
implementation.
Python file objects aren't "files" only in the sense that they exist in
memory rather than on disk in the file system, but other than that, I
believe your explanation is at too low a level to be helpful. Neil said
he's a beginner who hasn't done any programming since BASIC on an
Acorn, and you're talking about low-level details like memory
locations. Let me guess, you're also a C programmer?
As far as coding in Python is concerned, inp = file(pathname) creates a
file object, which *is* a file in all practical sense. Everything else
is just an implementation detail, which could change depending on the
version of Python, the operating system, and the underlying hardware.
[...]
> >>>>print inp.readlines()
> >
> > ['spam & eggs\n', 'spam & chips\n', 'spam & spam']
> >
> > but if I do it again I get:
> >>>> print inp.readlines()
> >
> > []
> >
> > I'm baffled, why is inp now empty?
>
> I suspect you have hit the end of the file.
Yes. readlines reads from the current file position, like all read
operations. To read all the text again, you have to reset the file
position with seek:
inp.seek(0)
--
Steven D'Aprano
More information about the Tutor
mailing list