2012-11-26 88 views
0

我有一個使用Scraperwiki寫入其sqlite商店的項目,但我需要編寫一個CSV。美中不足的是,所有的數據都存儲在一個字典,它工作得很好寫的sqlite:將表格劃成字典並將每行寫入CSV

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?

+0

你的代碼看起來不錯,除了這一點:'當d = defaultdict(拉姆達:「」 ) d_order = d ['timestamp'],d ['line_number'],d ['message'],d ['string']'只需給出DictWriter中的列名列表。或者可能是我不明白的東西? – crow16384

+0

@ crow16384我想弄清楚我是否需​​要DefaultDict和DictWriter。這聽起來像我不需要兩個。 – Amanda

回答

0

這應該這樣做。你並不需要default_dict可言,d_order只需要爲字段名稱列表,或在這種情況下字典鍵:

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)