Klasse zum auslesen einer Datei

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
BlackJack

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()
Antworten