Python for循环内部的字典导致TypeError,而for循环外部的字典工作正常

Python for循环内部的字典导致TypeError,而for循环外部的字典工作正常,python,dictionary,Python,Dictionary,基本上我要做的是搜索excel文件中一列中的所有值,如果它们与单独文本文件中的任何数据值匹配,则将它们标记为绿色 我很抱歉,如果我的代码很难阅读,仍然是一个初学者 因此,下面的将正常运行,并打印字典“DicteXcel”,而不会出现任何问题: dictIPExcel = {} ##############IMPORTANT CHANGE HERE, FILE NAME######################## #Change file name here to suit your file

基本上我要做的是搜索excel文件中一列中的所有值,如果它们与单独文本文件中的任何数据值匹配,则将它们标记为绿色

我很抱歉,如果我的代码很难阅读,仍然是一个初学者

因此,下面的将正常运行,并打印字典“DicteXcel”,而不会出现任何问题:

dictIPExcel = {}
##############IMPORTANT CHANGE HERE, FILE NAME########################
#Change file name here to suit your file
wb = openpyxl.load_workbook('file.xlsx')
#Copy sheet name here
sheet = wb.active

#What font color to change to below

greenFill = PatternFill(start_color='0000B200', end_color='0000B200', fill_type='solid')

#This will create a list containing every line in the below txt file
IPlist = open('No Config or Denied devices.txt').read().split('\n')

#Loops through A19-A100, gathering the value in each row into dictIPExcel
for t in range(19,100):
    dictIPExcel["A{0}".format(t)] = sheet['A'+ str(t)].value
print dictIPExcel
sheetz = wb.sheetnames

for a in sheetz:
    sheet = a
    dictIPExcel = {}

    for l in range(19,100):
        for x,y in dictIPExcel.items():
            for z in IPlist:
                if y == z:
                    print "match"
                    sheet[x].fill = greenFill
wb.save('textCopy4.xlsx')
但是,如果我将“dictpexcel”移动到第二个for循环中,它会抛出一个“TypeError:Strings必须是整数”。根据我的理解,这意味着将“A50”作为字典中的索引基本上是不合适的。我的问题是,为什么这在循环之外起作用?字典中的数据索引在循环外与循环内没有变化,但错误只在循环内抛出。内部带有循环的代码:

for a in sheetz:
    sheet = a
    dictIPExcel = {}
    for t in range(19,100):
        dictIPExcel["A{0}".format(t)] = sheet['A'+ str(t)].value
    for l in range(19,100):
        for x,y in dictIPExcel.items():
            for z in IPlist:
                if y == z:
                    print "match"
                    sheet[x].fill = greenFill
以下是输出:

Traceback (most recent call last):
  File "C:..\testing.py", line 49, in <module>
    dictIPExcel["A{0}".format(t)] = sheet['A'+ str(t)].value
TypeError: string indices must be integers
回溯(最近一次呼叫最后一次):
文件“C:..\testing.py”,第49行,在
dictIPExcel[“A{0}”.format(t)]=工作表['A'+str(t)]。值
TypeError:字符串索引必须是整数

我能做些什么让它在循环中运行吗?或者,也许有更好的方法来完成我正在尝试做的事情,检查每一张工作表并突出显示匹配的数据?

我认为这与DicteXcel无关。错误表明变量
工作表
是一个
str
,而不是您正在处理的
dict

看看:

#Copy sheet name here
sheet = wb.active
然后在此处覆盖它:

for a in sheetz:
    sheet = a
我假设的是基于
sheetz=wb.sheetnames
str

这是对python的常见误解。For循环没有自己的变量名称空间,内部变量可以在其作用域之外删除变量。例如:

>>> for i in range(5): pass
... 
>>> print i
4
>>> 
如果在循环中使用不同的变量(
sheet\u name
?),则应该很好


祝你好运

sheetz是图纸名称的列表,它们是字符串。您需要使用wb获取句柄。通过名称获取工作表

for a in sheetz:
    sheet=wb.get_sheet_by_name(a)
    dictIPExcel = {}
    for t in range(19,100):
        dictIPExcel["A{0}".format(t)] = sheet['A' + str(t)].value
在第一种情况下(正确的一种)

因此,
工作表
是一本字典

在第二种(不正确)情况下


工作表
是一个列表(因此它需要整数索引)。

好的,因此对我有效的最终工作设置如下,适用于将来可能有类似问题的任何人。我认为上述两个答案都是正确的,但主要问题是我忘记调用.get_sheet_by_name()函数:

for a in sheetz:
    sheet2 = wb.get_sheet_by_name(a)
    dictIPExcel = {}
    for t in range(19,100):
        dictIPExcel["A{0}".format(t)] = sheet2['A'+ str(t)].value
    for l in range(19,100):
        for x,y in dictIPExcel.items():
            for z in IPlist:
                if y == z:
                    print "match"
                    sheet2[x].fill = greenFill
wb.save('Copy.xlsx')

通过此更改,脚本工作正常,我现在有了一个适当的绿色工作簿。:)

我认为这实际上是字符串理解的
.format
部分,尽管我不知道为什么。如果您使用的是Python 2,请对字符串使用
(“A%i”%(t))
,或者像以前一样使用
“A”+str(t)
。否则,在Python 3中,您需要在字符串中指定变量,
“A{0}”.format(0=t)
,尽管变量名不能以数值开头。另外,看看@keredson的答案,我觉得它是正确的。
sheet = a   # for a in sheetz, where  sheetz = wb.sheetnames
for a in sheetz:
    sheet2 = wb.get_sheet_by_name(a)
    dictIPExcel = {}
    for t in range(19,100):
        dictIPExcel["A{0}".format(t)] = sheet2['A'+ str(t)].value
    for l in range(19,100):
        for x,y in dictIPExcel.items():
            for z in IPlist:
                if y == z:
                    print "match"
                    sheet2[x].fill = greenFill
wb.save('Copy.xlsx')