1
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])

これが私がやりたいことです。ご覧のとおり、このコードは1つのcsvファイルを取得し、そこから4つのリストを作成します。今、私はそれらのリストで数学をすることができますし、そうするでしょうdata1[4]-data2[30]

しかし、リストを作成したい他のファイルもいくつかあります。しかし、上記の数学のようにコードを再利用できるようにしたいと思います(data1[4]-data2[30])。したがって、理想的には、配列を含むすべてのものに、他のファイルと同じ名前を付ける必要があります。

私はプログラミングにとても慣れていないので、これは少し難しいことがわかっています。明らかに、同じ名前のすべてのものと物事が衝突するので、私はそれを望んでいません。だからどういうわけか、私は自分の数学ロジックを再利用できるようにしたいので、いくつかの大規模な数学アルゴリズムをコピーしてすべての名前を変更する必要はありません。

明らかに、これらの4つの配列で計算を行い、結果を保存してファイル名を変更したくはありません。いいえ、プログラム内ですべてが同時に機能する必要があります。

私はこれを行う方法についていくつかのヒントを得ることができることを望んでいます。oopがどのように機能するかについての知識の範囲を広げようとしていますが、それは難しいことが証明されています。自分の問題を解決する方法を説明してもらうのが一番だと思います。

要約すると、1つのファイルから4つのリストが作成されています。別のファイルから4つの追加リストを作成したいのですが、配列に同じ名前を付けます。そして、私は一度だけ大規模な数学計算を作成し、それをすべてに機能させる必要があります。そして、それは私のプログラムに導入された将来の新しいデータのために機能します。

4

2 に答える 2

2

データ コンテナーが必要な場合は、適切なコンストラクター (ここではinitメソッド) を使用してクラスを作成することでこれを取得します。以下は、2 つのファイルからデータをロードする例です。

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)

メソッド (記述した数学のもの) を適用したい場合は、これらのメソッドをクラスに入れたいと思うかもしれませんが、正確に何をしたいのか、より具体的な例を挙げていただけますか?

于 2012-08-22T16:25:47.173 に答える
1

まず、手続き型ではなく、必ず OOP を実行したいですか? そのほとんどを関数に入れて、リストを含むタプルを返すことができます (そうです、関数から複数の値を返せるようにする Python の方法に似ています)。

OOP バージョンは @mike-vella の回答のようになります。

手続き的には、次のように書くことができます。

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')

質問: 連続する各ファイルのデータを対応するリストに追加しますか? あなたが使用したので、私はイエスだと思います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)

次のようにして、再帰的にすることができます。

datagroup = ([], [], [], [])
datagroup = get_datagroup('datafile1.csv', datagroup)
datagroup = get_datagroup('datafile2.csv', datagroup)
datagroup = get_datagroup('datafile3.csv', datagroup)
于 2012-08-22T16:54:12.347 に答える