2013-10-28 89 views
0

我想創建一個新的Excel表格並使用python向其添加數據。但是,我一直在嘗試「覆蓋單元格的嘗試」錯誤。我不明白的是,根據我寫我的代碼的方式,我認爲它不應該覆蓋任何單元格。下面是代碼: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

感謝@PeterDeGlopper捕捉!我們的兩個答案似乎沒有太大的區別;) – 2013-10-29 00:48:52

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