将数据对象列表转换为CSV

9

我正在使用Python 2.7.6。我想将我的对象列表转换为CSV格式。我有一个cdr对象列表,该对象包含一些字符串、整数和日期时间对象。

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文件。感谢您的帮助。

https://docs.python.org/3/library/pickle.html是最佳选择,否则您需要遍历属性并将其写入CSV。 - Ankit Jaiswal
你尝试过使用简单的列表而不是cdr类吗?这里的__iter__函数是错误的(如果误用iter()),如果实际运行,应该会抛出异常,而不是静默空白。 - tdihp
1
iter()函数返回一个可迭代对象。您必须使用.next()来进行迭代,或者使用list()函数将其转换为列表,例如wr.writerow(list(cdr)) - user6025378
2
看起来__iter__()应该是你的类的一部分。如果是这样的话,它需要缩进,否则它会被解释为自己的函数。 - user20160
1个回答

20

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

来自 Python 帮助文档:

iter(...)
iter(collection) -> iterator
iter(callable, sentinel) -> iterator
从对象中获取一个迭代器。在第一种形式中,参数必须提供它自己的迭代器,或者是一个序列。
在第二种形式中,该可调用对象会被调用直到返回哨兵值。


1
str(self.my_datetime) 是不必要的,因为 datetime 类有一个__str __() 方法,它将自动调用。 - martineau
很高兴知道,@martineau xD - slackmart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接