Files
piccreate/libs/utils.py
T

98 lines
2.8 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from django.utils.encoding import smart_unicode
from django.template.defaultfilters import slugify
import csv
import ConfigParser
import os.path
import re
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 not field:
field = 'column_%d' % i
if translate:
if field in translate:
print field + ' -> '+ translate[field]
field = translate[field]
field = slugify(field.strip()).replace('-', '_')
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
def get_translation(cfg_path, sec_name):
""" lädt die Zuordnung zwischen einem .csv Eingabefile und den
Attributen """
config = ConfigParser.RawConfigParser()
config.read(cfg_path)
trans = dict(config.items(sec_name))
return dict([[v,k] for k,v in trans.items()])
def CompleteEnding(path, newext):
''' Fügt die gegebene File Extension an den Filename/Pfad
'''
if not path: raise Csv2CouchError('no path given')
path, ext = os.path.splitext(path)
if not re.match(newext, ext):
path = path +'.'+newext
return path
def RemoveEnding(path, oldext):
''' entfernt die File Extension vom Filename/Pfad
'''
newpath, ext = os.path.splitext(path)
if not re.match(oldext, ext):
path = newpath
return path
# vim: set tw=75 ft=python ts=4 sw=4: