source: nappy/trunk/textParser.py @ 339

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/nappy/trunk/textParser.py@339
Revision 339, 2.7 KB checked in by astephen, 15 years ago (diff)

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1"""
2textParser.py
3=============
4
5A set of functions to parse text file data into lists, strings,
6reals, integers etc.
7
8"""
9
10import re
11import string
12
13pattnNoQuotes=re.compile("^[\"'].*\1$")
14
15def readItemFromLine(line, rttype=str):
16    rtitem=pattnNoQuotes.sub("", line.strip())
17    if rttype==int:
18        rtitem=int(rtitem)
19    elif rttype==float:
20        rtitem=float(rtitem)       
21    return rtitem
22
23def readItemsFromLine(line, nitems=None, rttype=str):
24    rtitems=re.split(r"\s+", line.strip())
25    if nitems and len(rtitems)!=nitems:
26        raise "Incorrect number of items (%s) found in line: \n'%s'" % (nitems, line)
27    if rttype==int:
28        rtitems=map(lambda x: int(x), rtitems)
29    elif rttype==float:
30        rtitems=map(lambda x: float(x), rtitems)       
31    return rtitems
32
33def readItemsFromLines(lines, nitems, rttype=str):
34    rtitems=[]
35    for line in lines:
36        rtitems=rtitems+[readItemFromLine(line, rttype)]
37    if rttype==int:
38        rtitems=map(lambda x: int(x), rtitems)
39    elif rttype==float:
40        rtitems=map(lambda x: float(x), rtitems)           
41    return rtitems
42
43def readItemsFromUnknownLines(object, nitems, rttype=str):
44    """Reads from an unknown number of lines until n items have been collected.
45    The 'object' argument can be a filehandle (i.e. obj=open('name.ext', 'r'))
46    or a string wrapped in a StringIO object (i.e. obj=StringIO.StringIO('abc')).
47    The 'object' argument can also be a list, in which case the unused lines are
48    also returned.
49    """
50    rtitems=[]
51    lines=[]   
52    if type(object)==list:
53        while len(rtitems)<nitems:
54            nextitem=object[0]
55            object=object[1:]
56            items=re.split(r"\s+", nextitem.strip())
57            lines.append(items)       
58            (rtitems, extras)=(rtitems+items[:nitems], items[nitems:])
59        if len(extras)>0:
60            raise "Could not split %s lines exactly into required number (%s) of items: \n%s" % (len(lines), nitems, lines)
61        if rttype==int:
62            rtitems=map(lambda x: int(x), rtitems)
63        elif rttype==float:
64            rtitems=map(lambda x: float(x), rtitems)
65        return (rtitems, object)
66    else:
67        while len(rtitems)<nitems:
68            items=re.split(r"\s+", object.readline().strip())
69            lines.append(items)       
70            (rtitems, extras)=(rtitems+items[:nitems], items[nitems:])
71        if len(extras)>0:
72            raise "Could not split %s lines exactly into required number (%s) of items: \n%s" % (len(lines), nitems, lines)
73        if rttype==int:
74            rtitems=map(lambda x: int(x), rtitems)
75        elif rttype==float:
76            rtitems=map(lambda x: float(x), rtitems)     
77        return rtitems
78
79
80
81
82   
83   
84
Note: See TracBrowser for help on using the repository browser.