2016-05-13 3 views
2

У меня есть Dict вроде этого:Написать Dict в файл CSV на правильном порядке

{ 
'col1': [1, 2, 3], 
'col2': [4, 5, 6], 
'col3' : [7, 8, 9] 
} 

и я хочу CSV, как

col1;col2;col3 
1;4;7 
2;5;8 
3;6;9 

Стараюсь с for петлями, но дон» t удалось записать значения в правильном порядке.

+2

Используйте 'ordereddict', а ключи' dict's по своей природе не упорядочены в том же порядке, что ключи построены, или сортировать ключи и итерацию по клавишам, чтобы получить содержимое в требуемом порядке – EdChum

ответ

2

Ст. как это должно работать:

import csv 

d = {...} 
with open('file.csv', 'wb') as f: 
    writer = csv.writer(f, delimiter=';') 

    header = ['col1', 'col2', 'col3'] 
    # header = sorted(d.keys()[, key=custom_order_fnc]) 
    rows = zip(*[d[col] for col in header]) 

    writer.writerow(header) 
    for row in row: 
     writer.writerow(row) 
+0

это дает мне сообщение об ошибке: 'TypeError: 'str' не поддерживает буферный интерфейс' –

0

Ключевым моментом здесь является преобразование

data = { 
'col1': [1, 2, 3], 
'col2': [4, 5, 6], 
'col3' : [7, 8, 9] 
} 

в список строк:

[(1, 4, 7), (2, 5, 8), (3, 6, 9)] 

Мы знаем, что это выражение будет получить список столбцов:

header = ['col1', 'col2', 'col3'] 
[data[h] for h in header] # [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

Если мы их застегнем вместе мы получим то, что хотим:

zip(*(data[h] for h in header)) # [(1, 4, 7), (2, 5, 8), (3, 6, 9)] 

С этим мы можем записать данные в файл CSV. Собираем все вместе:

import csv 

data = { 
'col1': [1, 2, 3], 
'col2': [4, 5, 6], 
'col3' : [7, 8, 9] 
} 

header = ['col1', 'col2', 'col3'] 
with open('dict_to_csv_in_order.csv', 'wb') as f: 
    writer = csv.writer(f) 
    writer.writerow(header) 
    writer.writerows(zip(*(data[h] for h in header))) 
0

Если вы используете pandas, то это будет очень легко писать CSV-файл.

import pandas as pd 
data = { 
    'col1': [1, 2, 3], 
    'col2': [4, 5, 6], 
    'col3' : [7, 8, 9] 
} 
df = pd.DataFrame(data, columns=['col1', 'col2', 'col3']) 
df.to_csv('csv_file.csv', sep=';', index=False) 
Смежные вопросы