Python Попытка перезаписать ошибку ячейки

Я пытаюсь создать новый лист excel и добавить данные к нему с помощью python. Тем не менее, я продолжаю сталкиваться с ошибкой «Попытка перезаписать ячейку». Я не понимаю, что согласно тому, как я написал свой код, я не думаю, что он должен переписывать любую ячейку. Вот код:

wb = xlwt.Workbook() ws = wb.add_sheet('Sheet1', cell_overwrite_ok=True) for key in DBDICT: numList = [] for value in DBDICT[key]: numList.append(float(value)) for i in range(len(DBDICT)): ws.write(i, 0, key.lat) ws.write(i, 1, key.lon) for j in range(len(numList)): ws.write(i, (j+2), numList[j]) 

Все, что я пытаюсь сделать, читается из словаря DBDICT и для каждой пары в словаре записывает первый номер ключа (ключ является кортежем из двух чисел, которые я сделал с помощью namedtuple ()) в первом столбце определенной строки в файле excel, второй номер ключа во втором столбце, а затем каждый номер соответствующего значения (который представляет собой список чисел) в остальных ячейках. Другими словами, если

  DBDICT = {(-90, -180):[1.0 , 2.0 , 3.0], (-180, -360):[2.0, 3.0, 4.0]} 

то в первой строке файла excel код ниже должен написать: | -90 | -180 | 1.0 | 2.0 | 3,0 | и во втором ряду: | -180 | -360 | 2.0 | 3,0 | 4.0 |

Почему Python думает, что я переписываю ячейку?

2 Solutions collect form web for “Python Попытка перезаписать ошибку ячейки”

Проблема в том, что вы дважды зацикливаете на своем словаре, что вызывает много перезаписи! Вы можете объединить две петли в одну, используя enumerate :

 for i, key in enumerate(DBDICT): numList = [] for value in DBDICT[key]: numList.append(float(value)) ws.write(i, 0, key.lat) ws.write(i, 1, key.lon) for j in range(len(numList)): ws.write(i, (j+2), numList[j]) с for i, key in enumerate(DBDICT): numList = [] for value in DBDICT[key]: numList.append(float(value)) ws.write(i, 0, key.lat) ws.write(i, 1, key.lon) for j in range(len(numList)): ws.write(i, (j+2), numList[j]) 

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

 for i, key in enumerate(DBDICT): ws.write(i, 0, key.lat) ws.write(i, 1, key.lon) for j, val in enumerate(DBDICT[key]): ws.write(i, j+2, float(val)) 

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

Это должно быть примерно так:

 rownum = 0 for key in DBDICT: ws.write(rownum, 0, key.lat) ws.write(rownum, 1, key.lon) colnum = 2 for val in DBDICT[key]: ws.write(rownum, colnum, float(val)) colnum += 1 rownum += 1 

Это довольно минимальное изменение для вашего кода. Я бы написал это так, используя встроенный метод enumerate и метод iteritems словаря:

 for (rownum, (key, value)) in enumerate(DBDICT.iteritems()): ws.write(rownum, 0, key.lat) ws.write(rownum, 1, key.lon) for (val_index, val) in enumerate(value): ws.write(rownum, val_index + 2, float(val)) 
Python - лучший язык программирования в мире.