2016-05-23 2 views
3

私はpython 2.7.6を使用しています。私はオブジェクトのリストをCSV形式に変換したいと思います。私はcdrオブジェクトのリストを持っています、このオブジェクトは、いくつかの文字列、intとdatatimeオブジェクトが含まれています。データオブジェクトのリストをCSVに変換

class cdr(): 
    def __init__(self): 
     # some init 

    def __iter__(self): 
     return iter(self.name, self.my_value,self.my_datetime) 

#from another class 
import csv 
def make_csv(self, cdr_list): 
    with open(self.file_name, 'wb') as csv_file: 
     wr = csv.writer(csv_file, delimiter=",") 
     for cdr in cdr_list: 
      wr.writerow(cdr) 

しかし、私は空のCSVを取得しています。手伝ってくれてありがとう。

+0

https://docs.python.org/3/library/pickle.htmlは、属性を繰り返し処理してからCSVに書き込む必要があります。 –

+0

まずcdrクラスの代わりに簡単なリストを試しましたか?ここでの__iter__関数は間違っています(iter()の場合は誤用)。実際に実行されている場合は、サイレントブランクの代わりに例外が必要です。 – tdihp

+1

'iter()'関数は反復可能オブジェクトを返します。それを繰り返し処理するには '.next()'を使用するか、 'list()'関数を使って 'wr.writerow(list(cdr))'のようにリストに変換する必要があります –

答えて

4

iter組み込み関数では、引数としてコレクションが必要なので、リスト形式で属性を渡します。次に@Shankarの提案を使用します。 Pythonのヘルプドキュメントから

class Cdr(): 

    def __iter__(self): 
     return iter([self.name, self.my_value, self.my_datetime]) 


#from another class 
with open(self.file_name, 'wb') as csv_file: 
    wr = csv.writer(csv_file, delimiter=',') 
    for cdr in cdr_list: 
     wr.writerow(list(cdr)) # @Shankar suggestion 

: - >イテレータ
ITER(呼び出し可能、センチネル) -

ITER(...)
ITER(コレクション)>イテレータ
からイテレータを取得します。オブジェクト。最初の形式では、引数は 自身のイテレータを提供するか、シーケンスでなければなりません。
第2の形式では、呼び出し可能コードは、センチネルを返すまで呼び出されます。

+1

'datetime'クラスが自動的に呼び出される' __str __() 'メソッドを持っているので、' str(self.my_datetime) 'は不要です。 – martineau

+0

それを知ってよかった、@martineau xD – slackmart

関連する問題