> I'm not sure why you're getting the MemoryError, but it'd be easier to > figure out if you posted the entire text of the traceback.
Traceback: <usual bit about in module..> Line 39: seg=codeSt[element:endInd+len(endStr] MemoryError Hehe. Helpful, no? I think I'll sprinkle print statements throughout as suggested, and wrap it in a function for that optimization Jeff mentioned. Thanks for the advice, I'll let you know how it goes. Regards, Liam Clarke I didn't think to On Wed, 08 Dec 2004 12:29:10 -0800, Jeff Shannon <[EMAIL PROTECTED]> wrote: > Liam Clarke wrote: > > > Hi all, > > > > I'm playing with a file, and attempting to replace a section with a > > string, and using the following command - > > > > seg=codeSt[element:endInd+len(endStr] > > codeSt=codeSt.replace(seg, hrefString) > > > > At the replace, I get a MemoryError. It's part of a for loop, but it > > gives the error the first time around. > > > I'm not sure why you're getting the MemoryError, but it'd be easier to > figure out if you posted the entire text of the traceback. > > A few other pointers -- > > You'll probably get better performance if you put all of this code > inside of a function. Even if you're only running it once, putting it > in a function allows the interpreter to do some optimization tricks on > locals() which can't be done at the module-global level (where you're > running now). It's just barely possible that just doing this will > help with your MemoryError problem. (You would probably benefit from > splitting it into multiple functions, actually. I'd have the code > that finds text and url values each in their own function, for example.) > > Try adding a line in between those two that prints out the value of > element and endInd, and then check that those numbers really are valid > indexes into codeSt. While you're at it, print out hrefString and > make sure it looks like it's supposed to. > > At the start of your program, you have the following: > > inp=file("toolkit.txt","r") > codeSt=inp.readlines() > inp.close() > codeSt="".join(codeSt) > > Since you're not processing by lines, and are explicitly joining all > the lines together, why have Python separate them for you? It would > be much more efficient to simply use 'codeSt = inp.read()', with no > need to join() afterwards. The readlines() method effectively does a > read() followed by splitting the result into lines; for your purposes, > there's no point in splitting the lines if you're just going to join() > them immediately. > > Instead of finding the start and end index of the segment you want to > replace, making a copy of that segment, and then scanning your > original string to replace that segment with a new chunk, it would > probably make more sense to simply grab codeSt before the segment and > after the segment and concatenate them with the new chunk. Thus, your > two lines above become > > codeSt = codeSt[:element] + hrefString \ > + codeSt[endInd+len(endStr)] > > Once again, this would avoid doing the same work twice. > > > Now, I had imagined that codeSt=codeSt+10 would destroy the old codeSt > > in memory and create a new codeSt. Am I right? > > Actually, this will probably raise a TypeError (cannot concatenate > 'str' and 'int' objects). ;) But yes, rebinding codeSt to a new > string should allow the old string to be destroyed (if there are no > other references to it). > > Hope that this helps. > > Jeff Shannon > Technician/Programmer > Credit International > > > > > _______________________________________________ > Tutor maillist - [EMAIL PROTECTED] > http://mail.python.org/mailman/listinfo/tutor > -- 'There is only one basic human right, and that is to do as you damn well please. And with it comes the only basic human duty, to take the consequences. _______________________________________________ Tutor maillist - [EMAIL PROTECTED] http://mail.python.org/mailman/listinfo/tutor