Code: Alles auswählen
from operator import itemgetter
class MetaData(object):
def __init__(self, column_names):
self.names = column_names
self.name2index = dict((n, i) for i, n in enumerate(column_names))
def __len__(self):
return len(self.names)
class Record(object):
def __init__(self, meta_data, values):
self.meta_data = meta_data
self.values = values
def __len__(self):
return len(self.values)
def __getitem__(self, index):
if isinstance(key, basestring):
index = self.meta_data.name2index[key]
return self.values[index]
__getattr__ = __getitem__
class CSVReader(object):
def __init__(self, filename, column_names=None, types=None, delimiter=';'):
self.lines = open(filename, 'r')
if column_names is None:
column_names = self.lines.readline().split(self.delimiter)
self.meta_data = MetaData(column_names)
if types is None:
types = [str] * len(self.meta_data)
self.types = types
def __iter__(self):
for line in self.lines:
values = tuple(
f(v) for f, v in zip(self.types, line.split(self.delimiter))
)
yield Record(self.meta_data, values)
def close(self):
self.lines.close()
class ColumnSelector(object):
def __init__(self, columns, records):
self.records = records
meta_data = records.meta_data
column_names = list()
self.indices = list()
for column in columns:
if isinstance(column, basestring):
column_names.append(column)
self.indices.append(meta_data.name2index[column])
else:
column_names.append(meta_data.names[column])
self.indices.append(column)
self.meta_data = MetaData(column_names)
def __iter__(self):
select = itemgetter(self.indices)
return (Record(self.meta_data, select(r)) for r in self.records)