0

我正在尝试创建一个新的 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文件中的某一行,第二列中key的第二个数字,然后是剩余框中对应值的每个数字(这是一个数字列表)。换句话说,如果

    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 认为我正在覆盖一个单元格?

4

2 回答 2

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))
于 2013-10-29T00:37:23.933 回答
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))
于 2013-10-29T00:37:50.140 回答