2014-11-06 5 views
1

Я разбираю большой фрагмент текста в словарях, с целью создания CSV-файла с ключами в качестве заголовков столбцов.Использование DictWriter для записи CSV, когда поля не известны заранее

csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)

Проблема возникает в Словаре для любого «n'th строки может включать в себя новые, никогда ранее не использовали ключ. Затем я хочу, чтобы CSV содержал столбец для этого нового ключа. Короче говоря, все мои поля не известны заранее, поэтому я не могу скомпилировать полный fieldnames в начале.

Есть ли рекомендуемый способ иметь csv.DictWriter не игнорировать недостающие поля, а вместо этого добавить их в fieldnames? Простое изменение fieldnames в этот момент оставило бы предыдущие строки с неправильным меньшим количеством полей.

+0

Можете ли вы предоставить образец словарной структуру. –

+0

Проблема в том, что ключи dict неизвестны до тех пор, пока код не выполнится, но я хочу, чтобы иметь возможность записывать CSV из списка dicts. Я работаю над этим, компилируя весь список dicts, а затем итерации по ключам, чтобы идентифицировать уникальные ключи, которые я могу использовать для имен полей. Однако по мере роста набора данных я хочу написать CSV, прежде чем я узнаю все диктофоны. – Pranab

+0

Pranab, пожалуйста, просмотрите мой ответ ниже. –

ответ

2

Вместо использования DictWriter, который может привести к путанице в вашем случае, как словари не упорядочены, я попытался с помощью writerow метода CSV. Вот что я сделал:

""" 
a) First took all the keys of dictionary and sorted it, which is not necessary. 
b) Created a result list which appends value related the headers which is key of our input dict and if key is not available then .get() will return None. 
    So result list will contain lists for rows data. 
c) Wrote header and each row from result list in csv file 
""" 

data_dict = [{ "Header_1":"data_1", "Header_2":"data_2", "Header_3":"data_3"}, 
      { "Header_1":"data_4", "Header_2":"data_5", "Header_3":"data_6"}, 
      { "Header_1":"data_7", "Header_2":"data_8", "Header_3":"data_9", "Header_4":"data_10"}, 
      { "Header_1":"data_11", "Header_3":"data_12"}, 
      { "Header_1":"data_13", "Header_2":"data_14", "Header_3":"data_15"}] 

""" 
    In the third dict we have extra key, value. 
    In forth we dont have have header_2 were we aspect blank value in our csv file. 
""" 
process_data = [ [k,v] for _dict in data_dict for k,v in _dict.iteritems() ]   

headers = [ i[0] for i in process_data ] 
headers = sorted(list(set(headers))) 

result = [] 
for _dict in data_dict: 
    row = [] 
    for header in headers: 
     row.append(_dict.get(header, None)) 
    result.append(row) 


import csv 
with open('demo.csv', 'wb') as csvfile: 
    spamwriter = csv.writer(csvfile, delimiter=';', dialect='excel', 
          quotechar='|', quoting=csv.QUOTE_MINIMAL) 
    spamwriter.writerow(headers)  
    for r in result: 
     spamwriter.writerow(r) 

enter image description here

Смежные вопросы