Help needed with nested parsing of file into objects
richard
pullenjenna10 at gmail.com
Tue Jun 5 17:30:53 EDT 2012
On Jun 5, 10:21 pm, richard <pullenjenn... at gmail.com> wrote:
> On Jun 5, 9:40 pm, Alain Ketterlin <al... at dpt-info.u-strasbg.fr>
> wrote:
>
>
>
>
>
>
>
>
>
> > richard <pullenjenn... at gmail.com> writes:
>
> > [I'm leaving the data in the message in case anybody has troubles going
> > up-thread.]
>
> > > Hi guys still struggling to get the code that was posted to me on this
> > > forum to work in my favour and get the output in the format shown
> > > above. This is what I have so far. Any help will be greatly
> > > apprectiated.
>
> > > output trying to achieve
> > > parsed = [
> > > {
> > > "a":"a",
> > > "b":"b",
> > > "c":"c",
> > > "A_elements":[
> > > {
> > > "a":1,
> > > "b":2,
> > > "c":3
> > > },
> > > {
> > > "a":1,
> > > "b":2,
> > > "c":3
> > > }
> > > ],
> > > "B_elements":[
> > > {
> > > "a":1,
> > > "b":2,
> > > "c":3,
> > > "C_elements":[
> > > {
> > > "a":1,
> > > "b":2,
> > > "c":3
> > > },
> > > {
> > > "a":1,
> > > "b":2,
> > > "c":3
> > > }
> > > ]
> > > }
> > > ]
> > > },
>
> > > {
> > > "a":"1",
> > > "b":"2",
> > > "c":"3",
> > > }
>
> > > ]
>
> > > file format unchangeable
>
> > > An instance of TestArray
> > > a=a
> > > b=b
> > > c=c
> > > List of 2 A elements:
> > > Instance of A element
> > > a=1
> > > b=2
> > > c=3
> > > Instance of A element
> > > d=1
> > > e=2
> > > f=3
> > > List of 1 B elements
> > > Instance of B element
> > > a=1
> > > b=2
> > > c=3
> > > List of 2 C elements
> > > Instance of C element
> > > a=1
> > > b=2
> > > c=3
> > > Instance of C element
> > > a=1
> > > b=2
> > > c=3
>
> > > An instance of TestArray
> > > a=1
> > > b=2
> > > c=3
>
> > > def test_parser(filename):
> > > class Stanza:
> > > def __init__(self, values):
> > > for attr, val in values:
> > > setattr(self, attr, val)
>
> > > def build(couple):
> > > if "=" in couple[0]:
> > > attr, val = couple[0].split("=")
> > > return attr,val
> > > elif "Instance of" in couple[0]:
> > > match = re.search("Instance of (.+) element", couple[0])
> > > return ("attr_%s" % match.group(1),Stanza(couple[1]))
> > > elif "List of" in couple[0]:
> > > match = re.search("List of \d (.+) elements", couple[0])
> > > return ("%s_elements" % match.group(1),couple[1])
>
> > You forgot one case:
>
> > def build(couple):
> > if "=" in couple[0]:
> > attr, val = couple[0].split("=")
> > return attr,val
> > elif "Instance of" in couple[0]:
> > #match = re.search("Instance of (.+) element", couple[0])
> > #return ("attr_%s" % match.group(1),Stanza(couple[1]))
> > return dict(couple[1])
> > elif "An instance of" in couple[0]: # you forgot that case
> > return dict(couple[1])
> > elif "List of" in couple[0]:
> > match = re.search("List of \d (.+) elements", couple[0])
> > return ("%s_elements" % match.group(1),couple[1])
> > else:
> > pass # put a test here
>
> > > fo = open(filename, "r")
> > > RE = re.compile("( *)(.*)")
> > > stack = [("-",[])]
> > > for line in fo:
> > > matches = RE.match(line)
> > > if len(matches.group(2)) > 0:
> > > depth = 1 + len(matches.group(1))
> > > while len(stack) > depth:
> > > stack[-2][1].append(build(stack[-1]))
> > > del stack[-1]
> > > stack.append( (matches.group(2),[]) )
> > > while len(stack) > 1:
> > > stack[-2][1].append(stack[-1])
>
> > Change this to:
>
> > stack[-2][1].append(build(stack[-1])) # call build() here also
>
> > > del stack[-1]
> > > return stack
>
> > Actually the first and only element of stack is a container: all you
> > need is the second element of the only tuple in stack, so:
>
> > return stack[0][1]
>
> > and this is your list. If you need it pretty printed, you'll have to
> > work the hierarchy.
>
> > -- Alain.
>
> Hi Alain, thanks for the reply. Amended the code and just busy
> debugging but the stack i get back justs return [None, None]. Also
> should have been clearer when i mentioned the format above the dicts
> are actually objects instantaited from classes and just printed out as
> obj.__dict__ just for representation putposes. so where you have
> replaced the following i presume this was because of my format
> confusion. Thanks
>
>
>
>
>
>
>
>
>
> > elif "Instance of" in couple[0]:
> > match = re.search("Instance of (.+) element", couple[0])
> > return ("attr_%s" % match.group(1),Stanza(couple[1])) #instantiating new object and setting attributes
>
> with
> > elif "Instance of" in couple[0]:
> > #match = re.search("Instance of (.+) element", couple[0])
> > #return ("attr_%s" % match.group(1),Stanza(couple[1]))
> > return dict(couple[1])
Sorry silly mistake made with "An instance" and "Instance of" code
emende below for fix
if "=" in couple[0]:
attr, val = couple[0].split("=")
return attr,val
elif re.search("Instance of .+",couple[0]):
#match = re.search("Instance of (.+) element", couple[0])
#return ("attr_%s" % match.group(1),Stanza(couple[1]))
return dict(couple[1])
elif re.search("An instance of .+", couple[0]):
return dict(couple[1])
elif "List of" in couple[0]:
match = re.search("List of \d (.+) elements", couple[0])
return ("%s_elements" % match.group(1),couple[1])
else:
pass
More information about the Python-list
mailing list