This question was asked on the comp.lang.python newsgroup:
How can I read the first line of a file and then delete this line, so that line 2 is line 1 on next read?
My first response was:
- You describe the standard behavior, unless you close the file, is that what you want to do; open file, read line 1, close file, then open file, read line 2, close file? The other suggestions here destory content, do you want that?
>>> f = open("D:/Pydev/test.txt") >>> f.readline() 'line one\n' >>> f.readline() 'line two\n' >>> f.readline() 'line three\n'
Then I replied with this code snip which worked rather well once I figured out file.close(self) was the way to pass the close() over-ride up to the parent file definition:
- Here is a non-destructive way keeping track of the current file position when closing the file and re-opening the file where you left off. You can always use seek(0) to go back to the beginning.
-- JeffSandys
code
class myfile(file):
"""remembers the position a file was closed at
and reopens the file at that position"""
myfiles = {}
def __init__(self, fname, *args):
file.__init__(self, fname, *args)
if self.name in myfile.myfiles:
pos = myfile.myfiles[self.name]
else:
pos = 0
return self.seek(pos)
def close(self):
myfile.myfiles[self.name] = self.tell()
file.close(self)Below is an example with a simple four line file.
PythonWin 2.3.3 (#51, Dec 18 2003, 20:22:39) [MSC v.1200 32 bit (Intel)] on win32.
Portions Copyright 1994-2001 Mark Hammond (mhammond@skippinet.com.au) - see 'Help/About PythonWin' for further copyright information.
>>> f = open("C:/Pydev/test.txt")
>>> f.readlines()
['line one\n', 'line two\n', 'line three\n', 'last line\n']
>>> ### short four line file
>>> f.close()
>>> from myfile import myfile
>>> f = myfile("C:/Pydev/test.txt")
>>> f.readline()
'line one\n'
>>> f.readline()
'line two\n'
>>> f.close()
>>> ### test, is the file really closed?
>>> f.readline()
Traceback (most recent call last):
File "<interactive input>", line 1, in ?
ValueError: I/O operation on closed file
>>> f = myfile("C:/Pydev/test.txt")
>>> f.readline()
'line three\n'
>>> ### reopened file starts where it left off
>>> f.readline()
'last line\n'
>>> f.close()
>>> f = myfile("C:/Pydev/test.txt")
>>> f.seek(0)
>>> ### return to the beginning of the file
>>> f.readline()
'line one\n'
>>>