如何解决“列表索引必须为整数或切片”错误

时间:2019-04-09 04:11:05

标签: python list shelve

我正在制作一个程序,该程序应该使用货架将您的IP地址保存到单独文件中的列表中。每次打开它时,都应将IP地址放在列表“ pubiplist”中的列表“ pubipcount”中。当我添加一个新的IP时,出现一个我不明白的错误。

我只是一点一点地运行了代码,以查找损坏的部分,因此我自由地将其范围缩小到仅需要帮助我的信息。我已经在网上寻找可能的答案,但没有发现对我有帮助的东西。

import shelve
import socket
import urllib.request

save = shelve.open('ip_whitelist', writeback=True)

hostname = socket.gethostname()
PubIP = urllib.request.urlopen('https://ident.me').read().decode('utf8')
LocIP = socket.gethostbyname(hostname)

save['pubipcount'] = 0
save['pubiplist'] = []

save['pubipcount'] = save['pubipcount'] + 1
save['pubiplist']['pubipcount'] = PubIP

这是确切的错误:

Traceback (most recent call last):
  File "C:\Users\brenn\Desktop\IP\ip.py", line 27, in <module>
    save['pubiplist']['pubipcount'] = PubIP
TypeError: list indices must be integers or slices, not str

3 个答案:

答案 0 :(得分:1)

问题是['pubipcount']。在上下文中,它只是一个字符串。我相信你想要

save['pubiplist'][save['pubipcount']] = PubIP

这样,您将引用save['pubipcount']中的值而不是字符串'pubipcount'作为索引。

编辑: 这可能会导致IndexError,因此使用append()更好

save['pubiplist'].append(PubIP)

答案 1 :(得分:1)

如果您使用list,则索引必须为整数,例如save['pubiplist'][0]

如果您希望将str作为密钥,则可以使用dict,将save['pubiplist'] = []更改为save['pubiplist'] = {}


针对您的情况,建议您使用PubIP作为密钥,并分别计算PubIP

from collections import defaultdict
# do this only once
save['pubiplist'] = defaultdict(int)

# recieve IP repeately

# update IP and count each time
save['pubiplist'][PubIP] += 1

答案 2 :(得分:1)

Shelve允许您将字符串用作键,但不能将其用作子索引。

最快的解决方法是将计数插入到密钥中:

save[f'pubiplist-{pubipcount}'] = PubIP