Python尝试覆盖单元格错误

时间:2013-10-28 23:41:54

标签: python excel

我正在尝试创建一个新的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 个答案:

答案 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))