将表刮成dict并将每行写入CSV

时间:2012-11-26 15:00:00

标签: python csv collections dictionary

我有一个项目使用Scraperwiki写入他们的sqlite商店,但我需要写一个CSV。问题是所有数据都存储在一个dict中,这对写入sqlite很好:

scraperwiki.sqlite.save(unique_keys = ['somekey'], data = data, table_name='fancy')

我刮掉每一行之后就跑了。 dict没有命令所以我不能只将值写入CSV。我一直在查看csv.DictWritercollections.defaultdict,我仍然围绕着如何重构我的代码,以便我可以编写数据,这是CSV的字典。以下是我现在编写的代码示例:

def store_exception(exception, line_number, some_string):
    data = {
        'timestamp'  : datetime.now(),
        'line_number': line_number,
        'message'    : exception,
        'string'     : some_string
    }
    scraperwiki.sqlite.save(unique_keys = ['timestamp'], data = data, table_name='error_log')

我想我想要这样的东西:

def store_exception(exception, line_number, some_string):
    data = {
        'timestamp'  : datetime.now(),
        'line_number': line_number,
        'message'    : exception,
        'string'     : some_string
    }
    d = defaultdict(lambda: "")
    d_order = d['timestamp'],d['line_number'],d['message'],d['string']

    with open('some/path.csv', 'w') as csvfile:
        linewriter = csv.DictWriter(csvfile, d_order, delimiter='|',
                            quotechar='"', quoting=csv.QUOTE_MINIMAL)
        linewriter.writerow(data)
但是,这似乎效率低下。我是否需要collections.defaultdict和csv.DictWriter?

1 个答案:

答案 0 :(得分:0)

这应该这样做。您根本不需要default_dict,d_order只需要是字段名称列表,或者在这种情况下是dict键:

def store_exception(exception, line_number, some_string):
    data = {
        'timestamp'  : datetime.now(),
        'line_number': line_number,
        'message'    : exception,
        'string'     : some_string
    }

    d_order = ['timestamp', 'line_number', 'message', 'string']

    with open('some/path.csv', 'w') as csvfile:
        linewriter = csv.DictWriter(csvfile, d_order, delimiter='|',
                            quotechar='"', quoting=csv.QUOTE_MINIMAL)
        linewriter.writerow(data)