Dexter, Here's a function that screens out all instrument blocks and puts them into a dictionary keyed on the instrument number:
-------------------------------------------- def get_instruments (file_name): INSIDE = 1 OUTSIDE = 0 f = file (file_name, 'ra') state = OUTSIDE instruments = {} instrument_segment = '' for line in f: if state == OUTSIDE: if line.startswith ('<CsInstruments'): state = INSIDE instrument_segment += line else: instrument_segment += line if line.lstrip ().startswith ('instr'): instrument_number = line.split () [1] elif line.startswith ('</CsInstruments'): instruments [instrument_number] = instrument_segment instrument_segment = '' state = OUTSIDE f.close () return instruments ------------------------------------------------ You have received good advice on using parsers: "beautiful soup" or "pyparse". These are powerful tools capable of doing complicated extractions. Yours is not a complicated extraction. Simon tried it with "beautiful soup". That seems simple enough, though he finds the data by index leaving open where he gets the index from. There's surely a way to get the data by name. Contrary to the parser the function will miss if tags take liberties with upper-lower case letters as they are probably allowed by the specification. A regular expression might have to be used, if they do. From your description I haven't been able to infer what the final format of your data is supposed to be. So I cannot tell you how to go on from here. You'll find out. If not, just keep asking. The SE solution which you said couldn't work out would be the following. It makes the same dictionary the function makes and it is case-insensitive: ------------------------------------------------ >>> Instrument_Segment_Filter = SE.SE ('<EAT> >>> "~(?i)<CsInstruments>(.|\n)*?</CsInstruments>~==\n\n" ') >>> instrument_segments= Instrument_Segment_Filter ('file_name', '') >>> print instrument_segments (... see all instrument segments ...) >>> Instrument_Number = SE.SE ('<EAT> ~instr.*~==\n') >>> instruments ={} >>> for segment in instrument_segments.split ('\n\n'): if segment: instr_line = Instrument_Number (segment) instrument_number = instr_line.split ()[1] instruments [instrument_number] = segment -------------------------------------------------- (If you're on Windows and the CRs bother you, take them out with an additional definition when you make your Instrument_Block_Filter: (13)= or "\r=") Regards Frederic ----- Original Message ----- From: <[EMAIL PROTECTED]> Newsgroups: comp.lang.python To: <python-list@python.org> Sent: Wednesday, August 30, 2006 1:51 AM Subject: Re: newbe question about removing items from one file to another file > > Anthra Norell wrote: > > Dexter, > > > > I looked at the format specification. It contains an example: > > > > ----------------------------------------------- > > > > <CsoundSynthesizer>; > > ; test.csd - a Csound structured data file > > > > <CsOptions> > > -W -d -o tone.wav > > </CsOptions> > > ... etc. -- http://mail.python.org/mailman/listinfo/python-list