I am trying to extract a number of locations from an existing file using Python. This is my current code for extracting the locations:
self.fh = open( fileName , "r+")
p = re.compile('regGen regPorSnip begin')
for line in self.fh :
if ( p.search(line) ):
self.porSnipStartFPtr = self.fh.tell()
sys.stdout.write("found regPorSnip")
This snippet is repeated a number of times (less the file open) with different search values, and seems to work: I get the correct messages, and the variables have values.
However, using the code below, the first write location is wrong, while subsequent write locations are correct:
self.fh.seek(self.rstSnipStartFPtr,0)
self.fh.write(str);
sys.stdout.write("writing %s" % str )
self.rstSnipStartFPtr = self.fh.tell()
I have read that passing certain read
/readline
options to fh
can cause an erroneous tell value because of Python's tendency to 'read ahead'. One suggestion I saw for avoiding this is to read the whole file and rewrite it, which isn't a very appealing solution in my application.
If i change the first code snippet to:
for line in self.fh.read() :
if ( p.search(line) ):
self.porSnipStartFPtr = self.fh.tell()
sys.stdout.write("found regPorSnip")
Then it appears that self.fh.read()
is returning only characters and not an entire line. The search never matches. The same appears to hold true for self.fh.readline()
.
My conclusion is that fh.tell
only returns valid file locations when queried after a write operation.
Is there a way to extract the accurate file location when reading/searching?
Thanks.