import csv

datafile = csv.reader(open('datafile.csv','rb'), delimiter=",", quotechar='|')
date, data1, data2, data3 = [], [], [], []

for row in datafile:
    date.append(row[0])
    data1.append(row[1])
    data2.append(row[2])
    data3.append(row[3])

Oto, co chcę zrobić. Jak widać, ten kod ma 1 plik CSV i tworzy 4 listy z niego. Teraz mogę i zrobię matematykę na tych listach, takich jak data1[4]-data2[30]

Ale mam też kilka innych plików, z których chcę również tworzyć listy. Ale chcę być w stanie ponownie wykorzystać mój kod, taki jak moja matematyka widoczna powyżej (data1[4]-data2[30]). Najlepiej więc wszystko, w tym tablicę należy nazwać tak samo dla innych plików.

Jestem super nowy w programowaniu, więc okazuje się, że jest trochę trudny. Oczywiście rzeczy zderzają się ze wszystkim, co jest nazywane tym samym i nie chcę tego. Tak więc przez OOP Chcę być w stanie ponownie wykorzystać moją logikę matematyczną i nie muszę kopiować masywnych algorytmów matematycznych i nazwy wszystkiego.

Oczywiście nie chcę po prostu robić matematyki w tych 4 tablicach, zapisywać wyniki i zmień nazwę pliku. Nie wszystko musi pracować w tym samym czasie w moim programie.

Mam nadzieję, że mogę dostać kilka wskazówek, jak to zrobić. Próbuję rozszerzyć mój zakres wiedzy o tym, jak działa OOP, ale okazuje się trudne. Myślę o tym, jak naprawić mój własny problem byłoby najlepsze.

Aby podsumować, mam 4 listy utworzone z 1 pliku. Chcę utworzyć 4 dodatkowe listy z innego pliku, ale mają tablice być nazwane tak samo. A potem muszę tylko utworzyć moje masywne obliczenia matematyczne raz i czy działają dla wszystkiego. I czy działają dla wszystkich przyszłych nowych danych wprowadzonych do mojego programu.

1
user1594138 22 sierpień 2012, 20:17

2 odpowiedzi

Najlepsza odpowiedź

Chcesz kontenerowi danych, otrzymasz to, wykonując klasę z odpowiednim konstruktorem ( init tutaj). Poniżej znajduje się przykład, w którym ładujesz dane z dwóch plików.

import csv

datafile1 = csv.reader(open('datafile1.csv','rb'), delimiter=",", quotechar='|')
datafile2 = csv.reader(open('datafile2.csv','rb'), delimiter=",", quotechar='|')


class data(object):

    def __init__(self,data_file):

        self.date, self.data1, self.data2, self.data3 = [], [], [], []

        for row in data_file:
            self.date.append(row[0])
            self.data1.append(row[1])
            self.data2.append(row[2])
            self.data3.append(row[3])


data1 = data(datafile1)
data2 = data(datafile2)

Jeśli chcesz zastosować metody (opisane rzeczy z matematyki), możesz umieścić te metody w klasie, czy możesz podać kilka konkretnych przykładów dokładnie tego, co chcesz zrobić?

1
aneroid 22 sierpień 2012, 16:58

Po pierwsze, koniecznie chcesz zrobić OOP w przeciwieństwie do procedury? Możesz umieścić większość tego w funkcji i zwrócić krotkę zawierającą listy (tak, to trochę jak droga Pythona, aby umożliwić zwrotu więcej niż jednej wartości z funkcji).

Wersja OOP byłaby jak odpowiedź @ Mike-Vella.

Proceduralnie, możesz napisać:

import csv

def get_datagroup(data):
    # data is the filename = 'datafile.csv'
    datafile = csv.reader(open(data,'rb'), delimiter=",", quotechar='|')
    date, data1, data2, data3 = [], [], [], []

    for row in datafile:
        date.append(row[0])
        data1.append(row[1])
        data2.append(row[2])
        data3.append(row[3])

    return (date, data1, data2, data3)

datagroup1 = get_datagroup('datafile1.csv')
datagroup2 = get_datagroup('datafile2.csv')

Pytanie: Czy chcesz dołączyć wszystkie kolejne dane pliku do tej odpowiedniej listy? Zgaduję tak, ponieważ użyłeś append:

import csv

def get_datagroup(data, data_tuples):
    # data is the filename = 'datafile.csv'
    # data_tuples holds date, data1,2,3
    datafile = csv.reader(open(data,'rb'), delimiter=",", quotechar='|')

    # you can use: data_tuples[0], data_tuples[1], data_tuples[2], data_tuples[3]
    # instead of : date,           data1,          data2,          data3
    date, data1, data2, data3 = data_tuples

    for row in datafile:
        date.append(row[0])
        data1.append(row[1])
        data2.append(row[2])
        data3.append(row[3])

    return (date, data1, data2, data3)

#initially, data tuples are empty
datagroup1 = get_datagroup('datafile1.csv', ([], [], [], []))
#then pass each subsequent call the last call's result tuple
#so that datagroup2 will have the results of datagroup1 and the new stuff
datagroup2 = get_datagroup('datafile2.csv', datagroup1)

Możesz dokonać tego rekurencyjnego, wykonując:

datagroup = ([], [], [], [])
datagroup = get_datagroup('datafile1.csv', datagroup)
datagroup = get_datagroup('datafile2.csv', datagroup)
datagroup = get_datagroup('datafile3.csv', datagroup)
1
aneroid 22 sierpień 2012, 16:54