0

我有一个项目正在使用 Scraperwiki 写入他们的 sqlite 商店,但我只需要编写一个CSV。问题是所有数据都存储在一个字典中,它可以很好地写入 sqlite:

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

我在刮完每一行后运行它。字典没有顺序,所以我不能只将值写入 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 吗?

4

1 回答 1

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)
于 2012-11-26T15:18:22.030 回答