Klasse zum auslesen einer Datei
@Ambriador: eine Methode sollte genau eine Sache machen. Z.B. entweder etwas Setzen, oder einen Wert zurückliefern. Macht sie beides, verwirrt das nur, wie Dich z.B., da Du Dich ja gezwungen gefühlt hast, den Rückgabewert an irgendetwas (self.filename) zu binden, was so gar keinen Sinn gemacht hat.
Damit die API nicht so stehen bleibt, hier mal ein Beispiel wie so eine Klasse eher aussehen sollte:
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
import csv
import io
from itertools import izip
CSV_SOURCE = '''\
Zeit,Temperatur
0,15.2
3,16.1
6,14.8
9,20.2
'''
class Table(object):
def __init__(self, headers, columns):
self.headers = headers
self.columns = columns
def __repr__(self):
return '{0.__class__.__name__}({0.headers!r}, {0.columns!r})'.format(
self
)
def __eq__(self, other):
try:
return (
(self.headers, self.columns) == (other.headers, other.columns)
)
except AttributeError:
return NotImplemented
def __ne__(self, other):
return not self == other
def __hash__(self):
return TypeError('unhashable type: ' + self.__class__.__name__)
@classmethod
def read_csv(cls, csv_file):
reader = csv.reader(csv_file)
headers = next(reader)
columns = [map(float, row) for row in izip(*reader)]
return cls(headers, columns)
@classmethod
def load_csv(cls, filename):
with open(filename) as csv_file:
return cls.read_csv(csv_file)
def main():
table_a = Table(
['Zeit', 'Temperatur'], [[0.0, 3.0, 6.0, 9.0], [15.2, 16.1, 14.8, 20.2]]
)
table_b = Table.read_csv(io.BytesIO(CSV_SOURCE))
table_c = Table.load_csv('test.csv')
print(table_a)
print(table_b)
print(table_c)
print(table_a == table_b == table_c)
if __name__ == '__main__':
main()