Python尝试覆盖单元格错误

我正在尝试创build一个新的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()创build的两个数字的元组) 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认为我覆盖了一个单元?

问题是你循环两次你的字典,这确实会导致许多重写! 您可以使用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)) 

它看起来像你的循环closures。 你的缩进并没有完全正确,所以我不完全确定你的原始循环是什么样的,但是我看到你在引用写入工作表的循环中引用了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 

这是对你的代码的一个相当小的改变。 我实际上是这样写的,使用内buildenumerate和字典的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))