#!/usr/bin/env python # -*- coding: utf-8 -*- from django.utils.encoding import smart_unicode from django.template.defaultfilters import slugify import csv def csv_open(csvfile, dialect=None): fh = open(csvfile, 'rb') if dialect is None: sniffer = csv.Sniffer() dialect = sniffer.sniff(fh.read(1024), delimiters=';,\t') fh.seek(0) reader = csv.reader(fh, dialect=dialect) return reader class CSVRow(object): def __init__(self, field_refinition, row): self.row = row self.firstrow = field_refinition for i, field in enumerate(field_refinition): try: setattr(self, field, smart_unicode(row[i])) except IndexError: setattr(self, field, None) def __getattr__(self, name): # 'None'-fallback to make life easy return None def __repr__(self): ret = repr(self.__dict__) return ret def row(self): return self.row class CSVImport(object): def __init__(self, csvfile, dialect=None, translate=None): self.reader = csv_open(csvfile, dialect) self.rows = [] for row in self.reader: self.rows.append(row) self.firstrow = self.rows[0] self.field_definition = [] for i, field in enumerate(self.rows[0]): if translate: if field in translate: print field + ' -> '+ translate[field] field = translate[field] field = slugify(field.strip()).replace('-', '_') if not field: field = 'column_%d' % i self.field_definition.append(field) def __getitem__(self, key): try: return CSVRow(self.field_definition, self.rows[int(key) + 1]) except (ValueError, TypeError): raise IndexError() def __iter__(self): for row in self.rows[1:]: yield CSVRow(self.field_definition, row) def firstrow(self): return self.firstrow