近几年,python凭借其简单好上手、功能强大广受小白们的喜爱。但是随着步入深水区,繁华景象背后的竹架子就会慢慢显露出来。
请看以下巨坑的代码
sigle_dict = {}
sigle_dict["sheet_name"] = sheet_name
sigle_dict["nrows"] = str(x + 1)
name = sheet.cell_value(x, 1).strip()
if (name != "-" and name != None and name != ""):
sigle_dict["name"] = name.strip()
sigle_dict["meno"] = ''
name_list.append(sigle_dict)
sigle_dict["sheet_name"] = sheet_name
sigle_dict["nrows"] = str(x + 1)
name = sheet.cell_value(x, 2).strip()
if (name != "-" and name != None and name != ""):
sigle_dict["name"] = name.strip()
sigle_dict["meno"] = ''
name_list.append(sigle_dict)
name = sheet.cell_value(x, 3).strip()
if (name != "-" and name != None and name != ""):
sigle_dict["name"] = name.strip()
sigle_dict["meno"] = ''
name_list.append(sigle_dict)
看着好像都没问题,三次读的数据都插入name_list里了,其中条数也对得上。由于数据较多没法认真看。其实后来才发现,name = sheet.cell_value(x, 1).strip()这个压根没有插入name_list里,反而将name = sheet.cell_value(x, 3).strip() 这个重复插入了一遍。后来改成
sigle_dict = {}
sigle_dict["sheet_name"] = sheet_name
sigle_dict["nrows"] = str(x + 1)
name = sheet.cell_value(x, 1).strip()
if (name != "-" and name != None and name != ""):
sigle_dict["name"] = name.strip()
sigle_dict["meno"] = ''
name_list.append(sigle_dict)
sigle_dict_1 = {}
sigle_dict_1["sheet_name"] = sheet_name
sigle_dict_1["nrows"] = str(x + 1)
name_1 = name.strip()
name = sheet.cell_value(x, 2).strip()
if (name != "-" and name != None and name != ""):
sigle_dict_1["name"] = name.strip()
sigle_dict_1["meno"] = ''
name_list.append(sigle_dict_1)
#self.name_list_deal(sigle_dict)
sigle_dict_2 = {}
sigle_dict_2["sheet_name"] = sheet_name
sigle_dict_2["nrows"] = str(x + 1)
name_2 = name.strip()
name = sheet.cell_value(x, 3).strip()
if (name != "-" and name != None and name != ""):
sigle_dict_2["name"] = name.strip()
sigle_dict_2["meno"] = ''
name_list.append(sigle_dict_2)
这样就正确了。怀疑是python插入list的时候,数据往下执行被改写了。导致原始的还没被插入。突然想起了之前C++高级课程里讲的,代码从来就不是从上往下执行的。他会经过编译器优化,那么如果上下文没有关联的代码,不能保证其顺序执行。但是这里上下文明显有关联。估计是python的一个bug吧。
网友评论