2015-08-10 1 views
4

У меня есть словарь, который имеет координаты ячейки в качестве ключей и нужное содержимое ячейки в качестве значения, например:Использование словаря ключей в качестве координат при записи в формате CSV

dict1 = {'AN32': '2', 'AZ17': '47', ect...} 

Диапазон ячеек D4: AZ52

Я хочу записать это в файл csv.

Проблема, с которой я сталкиваюсь, заключается в том, что словарь не обязательно упорядочен по алфавиту или по номеру, как видно из приведенного выше примера.

Я знаю, как писать в файл .csv с

with open('example.csv', 'w') as f: 

    for i in dict1: 

     f.write(str(dict1[i]) + ',') 

это будет записывать значения в порядке, который будет означать, что они не были бы в правильной клетке, мне нужно, чтобы они были в ячейку, указанную их ключом.

+0

Возможный дубликат http://stackoverflow.com/questions/14765173/sorting-a-dictionary-and-writing-it-to-a-csv-file?rq=1 – stark

+0

Как должен выглядеть ваш желаемый результат точно в csv-файле? –

+0

Предполагаю, что данные в CSV должны содержать 48 столбцов и 48 строк. Это верно? –

ответ

1

Этот код использует представление списка для построения каждой строки.

Сначала мы создаем список меток столбцов, используя строку uppercase из модуля string, и мы создаем список всех меток столбцов, используя простое понимание списка.

Затем мы используем несколько более сложное понимание списка, которое делает ключ, комбинируя каждую метку столбца с номером текущей строки (преобразуется в строку). Этот ключ передается методу dict1.get(), чтобы получить значение, связанное с этим ключом. Мы используем пустую строку '' в качестве второго аргумента для .get(), так что, если ключ не существует в dict, мы получаем пустую строку.

Затем мы используем метод .join() для объединения всех этих строк, разделенных запятыми.

from string import uppercase 

#Make a list of the column letters 
cols = list(uppercase[3:]) + ['A' + c for c in uppercase] 
#print(cols) 

with open('example.csv', 'w') as f: 
    for r in range(4, 53): 
     row = ','.join([dict1.get(c + str(r), '') for c in cols]) 
     f.write(row + '\n') 

Если значения в dict1 фактически int, а не строки, то вам нужно преобразовать их в строки, прежде чем присоединиться к ним. Измените понимание списка на

row = ','.join([str(dict1.get(c + str(r), '')) for c in cols]) 

Это поможет, даже если некоторые значения являются строками, а некоторые - числами.

+0

Я прочитал и понял решение, и он очень изящный. Однако он также выдает ошибку: «TypeError: элемент последовательности 12: ожидаемая строка, в найденный» ' –

+0

@JoeSmart: Я подозреваю, что сообщение об ошибке на самом деле говорит« ожидаемая строка, int found ». Все значения в строках' dict1' «Я предположил, что они были из ваших выборочных данных. Кстати, я просто заметил, что у вас есть ключ в ваших образцах данных« Z2 », но вы также сказали, что диапазон ячеек -« D4: AZ52 ». –

+0

Мои выборочные данные я не извиняюсь, мои извинения. Диапазон, который я дал, правильный. Я просто набрал случайные координаты для примера данных в качестве примера структуры. Я дважды проверю, что все строки. –

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