【问题标题】:Scraping a table into a dict and writing each row to CSV将表格刮成字典并将每一行写入 CSV
【发布时间】:2012-11-26 15:00:00
【问题描述】:

我有一个项目正在使用 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 吗?

【问题讨论】:

  • 你的代码看起来不错,除了这个:d = defaultdict(lambda: "") d_order = d['timestamp'],d['line_number'],d['message'],d['string'] 只需在 DictWriter 中给出列名列表。还是我不明白什么?
  • @crow16384 我想弄清楚我是否需​​要 DefaultDict 和 DictWriter。听起来我两个都不需要。

标签: python csv collections dictionary


【解决方案1】:

应该这样做。你根本不需要 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)

【讨论】:

    猜你喜欢
    • 2016-12-10
    • 2018-04-17
    • 2012-01-30
    • 2014-06-17
    • 2018-03-19
    • 2017-03-29
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多