我正在尝试创建一个新的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认为我覆盖了一个单元?
答案 0 :(得分:1)
问题是你在字典上循环两次,这会造成很多覆盖!您可以使用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):
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))
答案 1 :(得分:1)
看起来你的循环已关闭。你的缩进没有完全正确,所以我不完全确定你的原始循环是什么样的,但我看到你在写入工作表的循环中引用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))