2016-04-27 11 views
1

Pythonのクラスで少し助けが必要です。 異なるファイルからデータを保存する必要があります。解析するクラス構造Pythonのファイルからのデータ

ここにはアイデアがあります(コードのこの部分が動作します)。私はからそれぞれのファイルから必要な情報をすべて格納するために使用します。

class Element(): 
    def __init__(self, filename): 
    self.filename = filename 
    self.function, self.name = readFile(self.filename) 
    self.vector = make_vector(table_COG_general, self.function) 

そして今、私は子供のクラスは有用であろうと思う:それはオブジェクトのリストを格納するためだ「要素を()」(これは動作しません):

class ListElements(Element): 
    def __init__(self, filename, list_of_filenames): 
    Element.__init__(self, filename) 
    self.liste_elements = extractData(self.list_of_filenames) 


list_of_filenames = ['data'+str(i)+'.txt' for i in range(1, 201)] 

私の問題があります私はクラスのElements()のパラメータとして "filename"を使うべきではない(ListElements()のようにクラスを使うことはできません - 関数readFileにはただ一つのファイル名しか必要ありません) Elements()にデータを送る方法。

現時点では、メインの内側にforループを含む要素のリストを作成していますが、データを使って分析する必要があり、むしろすべてのメソッドでクラスを使用したいと思うので実用的ではありません。

ありがとうございました!あなたは、データのようなものを格納するための任意のより良いアイデアを持っている場合は

、私はあなたがファイル名のリストを渡すためにあなたのinitで変数self.list_of_elementsを作成することをお勧め:)

+0

データベースとは何ですか? – e4c5

+0

私はあなたの問題を理解しているかどうか分かりませんが、 'ListElements'に' Element'の継承ではなく 'Element'のリストが含まれている方が適切ではないでしょうか? – Christoph

+0

あなたの説明から理解したところから。あなたはElementのすべての抽出と読み込みのロジックを持っている必要があります.ListElementは子クラスではいけません。ファイルのリストを取得して要素オブジェクトを作成し、データを抽出するだけです。 –

答えて

0

を共有してください。次に、ListElementに関数を作成します。この関数は、各ファイル名で要素を呼び出し、これらのオブジェクトをListElement関数に格納します。次に、各要素オブジェクトからデータを取得できます。 また、ListElement関数はself.vectorとself.function変数も取得するので、ListElementを子オブジェクトにしないことをお勧めします。それはあなたが望むものではないと思います。

少し例:

class Element: 
def __init__(self, filename): 
    self.filename = filename 
    self.function, self.name = readFile(self.filename) 
    self.vector = make_vector(table_COG_general, self.function) 

class ListElements: 
    def __init__(self, list_of_filenames): 
     self.list_of_filenames = list_of_filenames 
     self.elements = [] 

    def process_elements(self): 
     for filename in self.list_of_filenames: 
      self.elements.append(Element(filename)) 


list_of_filenames = ['data'+str(i)+'.txt' for i in range(1, 201)] 

その他の機能は、彼らが何を私のために明らかにされていないので、私はあなたがこれを行うことができる方法を提案することはできません。しかし、これもクラスの関数にすると良いかもしれません。 私はあなたがこれを使うことができ、ご質問がある場合はお気軽にお尋ねください!

+0

ありがとうございました!これはうまくいきます:) – Natha

+0

どこでchooseMedoidsを使用していますか?定義されている場所はどこですか? –

+0

あなたのコード例のインデントが正しくありません(私は今も間違った方法で入力しています)。これはあなたのスクリプトにも同じですか?それとも正しい方法ですか? –

1

二つの一般的な発言は:

  1. 私はクラスの継承を使用すると、あなたのケースで適切ではないと思います。あなたはListElementsElementを持っているかどうかをElementないであるかどうかを自問する必要があります。
  2. Pandasライブラリーを見て、データを分析しましたか?ファイルI/Oとデータ処理が簡単になります。
0

ここで、どのようにchooseMedoidsを使用していますか?定義されている場所はどこですか?

コード例のインデントが正しくありません(私はこれも間違った方法で入力しています)。これはあなたのスクリプトにも同じですか?それとも正しい方法ですか?

+0

あなたの助けてくれてありがとう:) 私のコードではインデントが正しいですが、ここではないので、私はここにコピー/ペーストすると、クラスの名前が定義と同じレベルになりません。 申し訳ありませんが、クラスメソッドで* randomElement *を呼び出す必要があります* chooseMedoids *、私は後で名前を変更...私は非常に簡単にする必要があります私のリストのK要素をランダムに選ぶために使用します.. 。 しかし、私はいつもエラーが発生するので、私はクラスを使用を停止しました。クラス* ListElements *がオブジェクトのオブジェクトであるため、エラーが発生することはありますか? – Natha

0

これは、リスト全体に対してchooseMedoidsを呼び出すためです。リストを繰り返し処理し、オブジェクトに対してchooseMedoidsを呼び出す必要があります。 例:

for item in self.elements: 
    item.chooseMedoids(k)