Python 对于范围内的i,只使用最后一行-openpyxl

Python 对于范围内的i,只使用最后一行-openpyxl,python,excel,range,openpyxl,Python,Excel,Range,Openpyxl,我正在使用openpyxl阅读excel表格。以下是我的问题代码: for i in range(3, lastRow): exData = {} exData["param1"] = sheet.cell(row=i, column=1).value exData["param2"] = float(sheet.cell(row=i, column=2).value) exData["param3"] = float(sheet.cell(row=i, col

我正在使用openpyxl阅读excel表格。以下是我的问题代码:

for i in range(3, lastRow):
    exData = {}
    exData["param1"] = sheet.cell(row=i, column=1).value
    exData["param2"] = float(sheet.cell(row=i, column=2).value) 
    exData["param3"] = float(sheet.cell(row=i, column=3).value) 
    exData["param4"] = float(sheet.cell(row=i, column=4).value)
    exData["param5"] = float(sheet.cell(row=i, column=5).value) 
    exData["param6"] = float(sheet.cell(row=i, column=6).value) 
    exData["param7"] = float(sheet.cell(row=i, column=7).value) 
    exData["param8"] = float(sheet.cell(row=i, column=8).value) 
    exData["param9"] = float(sheet.cell(row=i, column=9).value) 
    exData["param10"] = float(sheet.cell(row=i, column=10).value)

变量lastRow设置为6。现在的问题是,如果我打印exData,它只包含第五行的值。如果我打印出来,它会显示3 4 5。所以它设置正确,但可能没有正确保存?有什么想法吗

您正在为每个循环初始化字典。请在for循环外部初始化字典。或者,您可以使用下面的代码使用列表来存储每个字典

exDatas = []
for i in range(3, lastRow):
    exData = {}
    exData["param1"] = sheet.cell(row=i, column=1).value
    exData["param2"] = float(sheet.cell(row=i, column=2).value) 
    exData["param3"] = float(sheet.cell(row=i, column=3).value) 
    exData["param4"] = float(sheet.cell(row=i, column=4).value)
    exData["param5"] = float(sheet.cell(row=i, column=5).value) 
    exData["param6"] = float(sheet.cell(row=i, column=6).value) 
    exData["param7"] = float(sheet.cell(row=i, column=7).value) 
    exData["param8"] = float(sheet.cell(row=i, column=8).value) 
    exData["param9"] = float(sheet.cell(row=i, column=9).value) 
    exData["param10"] = float(sheet.cell(row=i, column=10).value)
    exDatas.append(exData)

每次在循环中都要重置exData

#outside loop
exData = {}
也许您可以使用i作为键保存在dict中,或者使用其他数据结构,如list和append

#your loop
exData[i] = {"param1": sheet.cell(row=i, column=1).value}

每次通过循环时,
i
设置为3、4、5,您都在将对应行中的数据存储在
exData[“param1”]
等中。因此,第二次通过覆盖第一次,第三次通过覆盖第二次。这就是为什么字典只包含最后一行的值

仅初始化字典一次,并将行号作为字典键的一部分:

exData = {}
for i in range(3, lastRow):
    exData[(i,"param1")] = sheet.cell(row=i, column=1).value

在循环的每次迭代中,都会覆盖字典(exData)中的值,如果希望字典中的每个值都是该列在三行中的值的列表,则需要将其重置为列表,然后追加这些列表

exData = {"param1":[], "param2":[], param3":[], "param4":[], "param5":[],
          "param6":[], "param7":[], param8":[], "param9":[], "param10":[]}

for i in range(3, lastRow):
    exData["param1"].append(sheet.cell(row=i, column=1).value)
    exData["param2"].append(float(sheet.cell(row=i, column=2).value)) 
    exData["param3"].append(float(sheet.cell(row=i, column=3).value)) 
    exData["param4"].append(float(sheet.cell(row=i, column=4).value))
    exData["param5"].append(float(sheet.cell(row=i, column=5).value)) 
    exData["param6"].append(float(sheet.cell(row=i, column=6).value)) 
    exData["param7"].append(float(sheet.cell(row=i, column=7).value)) 
    exData["param8"].append(float(sheet.cell(row=i, column=8).value)) 
    exData["param9"].append(float(sheet.cell(row=i, column=9).value))
    exData["param10"].append(float(sheet.cell(row=i, column=10).value))

正如其他人所说,您需要在循环之外初始化字典,并使用.append。这似乎是我们做这件事的简明扼要的方法:

exData = {"param"+str(i+1):[]} for i in range(10)}

for i in range(3, lastRow):
    exData["param1"].append(sheet.cell(row=i, column=1).value)
    for j in range(9):
        exData["param"+str(j+2)].append(float(sheet.cell(row=i, column=j+2).value))

这将覆盖EXDATA中的数据—永远不需要编写自己的循环<代码>工作表。iter\u行(最小行=3,最大列=10)是您想要的。还有一本字典。