def parse(self): '''Parses the CSV file named self.fileName and creates a list of corresponding Python objects (Object instances). Among object fields, some may be references. If it is the case, you may specify in p_references a dict of referred objects. The parser will then replace string values of some fields (which are supposed to be ids of referred objects) with corresponding objects in p_references. How does this work? p_references must be a dictionary: - keys correspond to field names of the current object; - values are 2-tuples: * 1st value is the list of available referred objects; * 2nd value is the name of the attribute on those objects that stores their ID. ''' # The first pass parses the file and creates the Python object f = file(self.fileName) firstLine = True lineNb = 0 for line in f: lineNb += 1 line = line.strip() if not line: continue if firstLine: # The first line declares the structure of the following 'data' # lines. self.identifySeparator(line) self.identifyAttributes(line) firstLine = False else: # Add an object corresponding to this line. lineObject = Object() if self.klass: lineObject.__class__ = self.klass i = -1 # Do we get the right number of field values on this line ? attrValues = line.split(self.sep) if len(attrValues) != len(self.attributes): raise WRONG_LINE % (lineNb, self.fileName) for attrValue in line.split(self.sep): i += 1 theValue = attrValue vType = self.attributesTypes[i] if self.attributesFlags[i]: # The attribute is multi-valued if not attrValue: theValue = [] elif '+' in theValue: theValue = [self.convertValue(v, vType) \ for v in attrValue.split('+')] else: theValue = [self.convertValue(theValue, vType)] else: # The attribute is mono-valued theValue = self.convertValue(theValue, vType) setattr(lineObject, self.attributes[i], theValue) self.res.append(lineObject) f.close() # The second pass resolves the p_references if any for attrName, refInfo in self.references.iteritems(): if attrName in self.attributes: # Replace ID with real object from p_references for obj in self.res: attrValue = getattr(obj, attrName) if isinstance(attrValue, list) or \ isinstance(attrValue, tuple): # Multiple values to resolve newValue = [] for v in attrValue: newValue.append(self.resolveReference(attrName,v)) else: # Only one value to resolve newValue = self.resolveReference(attrName, attrValue) setattr(obj, attrName, newValue) return self.res
def parse(self): '''Parses the CSV file named self.fileName and creates a list of corresponding Python objects (Object instances). Among object fields, some may be references. If it is the case, you may specify in p_references a dict of referred objects. The parser will then replace string values of some fields (which are supposed to be ids of referred objects) with corresponding objects in p_references. How does this work? p_references must be a dictionary: - keys correspond to field names of the current object; - values are 2-tuples: * 1st value is the list of available referred objects; * 2nd value is the name of the attribute on those objects that stores their ID. ''' # The first pass parses the file and creates the Python object f = file(self.fileName) firstLine = True lineNb = 0 for line in f: lineNb += 1 line = line.strip() if not line: continue if firstLine: # The first line declares the structure of the following 'data' # lines. self.identifySeparator(line) self.identifyAttributes(line) firstLine = False else: # Add an object corresponding to this line. lineObject = Object() if self.klass: lineObject.__class__ = self.klass i = -1 # Do we get the right number of field values on this line ? attrValues = line.split(self.sep) if len(attrValues) != len(self.attributes): raise WRONG_LINE % (lineNb, self.fileName) for attrValue in line.split(self.sep): i += 1 theValue = attrValue vType = self.attributesTypes[i] if self.attributesFlags[i]: # The attribute is multi-valued if not attrValue: theValue = [] elif '+' in theValue: theValue = [self.convertValue(v, vType) \ for v in attrValue.split('+')] else: theValue = [self.convertValue(theValue, vType)] else: # The attribute is mono-valued theValue = self.convertValue(theValue, vType) setattr(lineObject, self.attributes[i], theValue) self.res.append(lineObject) f.close() # The second pass resolves the p_references if any for attrName, refInfo in self.references.iteritems(): if attrName in self.attributes: # Replace ID with real object from p_references for obj in self.res: attrValue = getattr(obj, attrName) if isinstance(attrValue, list) or \ isinstance(attrValue, tuple): # Multiple values to resolve newValue = [] for v in attrValue: newValue.append(self.resolveReference(attrName, v)) else: # Only one value to resolve newValue = self.resolveReference(attrName, attrValue) setattr(obj, attrName, newValue) return self.res