def _load_state_from_file(self, file): # Read the data, and find out the encoding data = file.read() self.encoding = guess_encoding(data) schema = self.schema columns = self.columns for line in parse(data, columns, schema, guess=self.class_csv_guess, skip_header=self.skip_header, encoding=self.encoding): self._add_row(line)
def _load_state_from_file(self, file): # Guess encoding data = file.read() self.encoding = guess_encoding(data) # Build the parser parser = parse(data, self.columns, self.schema, self.class_csv_guess, self.has_header, self.encoding) # Header if self.has_header: self.header = parser.next() # Content for line in parser: self._add_row(line)
def _load_state_from_file(self, file): # Read the data and figure out the encoding data = file.read() encoding = guess_encoding(data) self.encoding = encoding # Parse lines = [] for name, value, parameters in parse_table(data): # Deserialize datatype = self.get_record_datatype(name) if isinstance(datatype, Unicode): value = datatype.decode(value, encoding=encoding) else: value = datatype.decode(value) # Build the value (a Property instance) deserialize_parameters(parameters, self.record_parameters) value = Property(value, **parameters) # Append lines.append((name, value)) # Read first line first = lines[0] if (first[0] != 'BEGIN' or first[1].value != 'VCALENDAR' or len(first[1].parameters) != 0): raise ValueError, 'icalendar must begin with BEGIN:VCALENDAR' lines = lines[1:] ################################################################### # Read properties n_line = 0 for name, value in lines: if name == 'BEGIN': break elif name == 'END': break elif name == 'VERSION': if 'VERSION' in self.properties: raise ValueError, 'VERSION can appear only one time' elif name == 'PRODID': if 'PRODID' in self.properties: raise ValueError, 'PRODID can appear only one time' # Add the property self.properties[name] = value n_line += 1 # The properties VERSION and PRODID are mandatory if ('VERSION' not in self.properties or 'PRODID' not in self.properties): raise ValueError, 'PRODID or VERSION parameter missing' lines = lines[n_line:] ################################################################### # Read components c_type = None c_inner_type = None uid = None for prop_name, prop_value in lines[:-1]: if prop_name in ('PRODID', 'VERSION'): raise ValueError, 'PRODID and VERSION must appear before '\ 'any component' if prop_name == 'BEGIN': if c_type is None: c_type = prop_value.value c_properties = {} c_inner_components = [] else: # Inner component like DAYLIGHT or STANDARD c_inner_type = prop_value.value c_inner_properties = {} continue if prop_name == 'END': value = prop_value.value if value == c_type: if uid is None: raise ValueError, 'UID is not present' if uid in self.components: component = self.components[uid] component.add_version(c_properties) else: component = Component(c_type, uid) component.add_version(c_properties) component.c_inner_components = c_inner_components self.components[uid] = component # Next c_type = None uid = None # Inner component elif value == c_inner_type: inner_component = InnerComponent(c_inner_type) inner_component.add_version(c_inner_properties) c_inner_components.append(inner_component) c_inner_type = None else: raise ValueError, 'Component %s found, %s expected' \ % (value, c_inner_type) else: datatype = self.get_record_datatype(prop_name) if c_inner_type is None: if prop_name in ('UID', 'TZID'): uid = prop_value.value else: if getattr(datatype, 'multiple', False) is True: value = c_properties.setdefault(prop_name, []) value.append(prop_value) else: # Check the property has not yet being found if prop_name in c_properties: msg = ('the property %s can be assigned only ' 'one value' % prop_name) raise ValueError, msg # Set the property c_properties[prop_name] = prop_value else: # Inner component properties if getattr(datatype, 'multiple', False) is True: value = c_inner_properties.setdefault(prop_name, []) value.append(prop_value) else: # Check the property has not yet being found if prop_name in c_inner_properties: msg = ('the property %s can be assigned only one' ' value' % prop_name) raise ValueError, msg value = prop_value # Set the property c_inner_properties[prop_name] = value ################################################################### # Index components for uid in self.components: component = self.components[uid] self.catalog.index_document(component)