2016-05-23 10 views
3

Я использую python 2.7.6. Я хотел бы преобразовать свой список объектов в формат csv. У меня есть список объектов cdr, этот объект содержит некоторый объект string, 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__ здесь неправильна (неправильно использовать ifer()), если она действительно запущена, вы должны иметь исключение, вместо молчащего пустого – tdihp

+1

Функция 'iter()' возвращает итерируемый объект. Вы должны использовать '.next()' для перебора или использования функции 'list()', чтобы преобразовать ее в список ... например 'wr.writerow (list (cdr))' –

ответ

4

iter встроенная функция ожидает набор как аргумент, поэтому передавайте атрибуты в виде списка. Затем используйте предложение @Shankar.

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 (вызываемые, дозорная) -> итератора
Получить итератор из объект. В первой форме аргумент должен предоставить свой собственный итератор или быть последовательностью.
Во второй форме вызываемый вызывается до тех пор, пока он не вернет часового.

+1

'str (self.my_datetime)' не нужно, так как класс 'datetime' имеет метод' __str __() ', который будет вызываться автоматически. – martineau

+0

Приятно знать это, @martineau xD – slackmart