39118ba34d89de621929ab8d9d8fdd874e68bb23 mmaddren Thu Mar 10 16:28:26 2011 -0800 Small update to previous commit, fixed a few errors diff --git python/ucscgenomics/rafile/RaFile.py python/ucscgenomics/rafile/RaFile.py index 1f8f5fb..f12842d 100644 --- python/ucscgenomics/rafile/RaFile.py +++ python/ucscgenomics/rafile/RaFile.py @@ -1,125 +1,125 @@ import sys import re -import orderedDict +import OrderedDict -class RaFile(orderedDict.OrderedDict): +class RaFile(OrderedDict.OrderedDict): """ Stores an Ra file in a set of entries, one for each stanza in the file. """ def __init__(self, entryType): self.__entryType = entryType - orderedDict.OrderedDict.__init__(self) + OrderedDict.OrderedDict.__init__(self) def read(self, filePath): """ Reads an rafile stanza by stanza, and internalizes it. """ file = open(filePath, 'r') entry = self.__entryType() stanza = list() keyValue = '' for line in file: line = line.strip() if len(stanza) == 0 and line.startswith('#'): self._OrderedDict__ordering.append(line) continue if line != '': stanza.append(line) elif len(stanza) > 0: if keyValue == '': keyValue, name = entry.readStanza(stanza) else: testKey, name = entry.readStanza(stanza) if keyValue != testKey: raise KeyError('Inconsistent Key ' + testKey) if name in self: raise KeyError('Duplicate Key ' + name) self[name] = entry entry = self.__entryType() stanza = list() if len(stanza) > 0: raise IOError('File is not newline terminated') file.close() def itervalues(self): for items in self._OrderedDict.__ordering(self): if not item.startswith('#'): yield self[item] def iteritems(self): for item in self._OrderedDict__ordering: if not item.startswith('#'): yield item, self[item] else: yield [item] def __str__(self): str = '' for item in self.iteritems(): if len(item) == 1: str += item[0].__str__() + '\n' else: str += item[1].__str__() + '\n' return str -class RaEntry(orderedDict.OrderedDict): +class RaEntry(OrderedDict.OrderedDict): """ Holds an individual entry in the RaFile. """ def readStanza(self, stanza): """ Populates this entry from a single stanza """ for line in stanza: self.__readLine(line) return self.__readName(stanza[0]) def __readName(self, line): """ Extracts the Stanza's name from the value of the first line of the stanza. """ if len(line.split(' ', 1)) != 2: raise ValueError() return map(str.strip, line.split(' ', 1)) def __readLine(self, line): """ Reads a single line from the stanza, extracting the key-value pair """ if line.startswith('#'): raise KeyError('Comment in the middle of a stanza') raKey, raVal = map(str, line.split(' ', 1)) self[raKey] = raVal def __str__(self): str = '' for key in self: str = str + key + ' ' + self[key] + '\n' return str