我正在制作一个程序,应该使用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
Shelve允许您使用字符串作为键,但不能将它们用作子索引。
最快的解决方法是将计数插入到密钥中:
save[f'pubiplist-{pubipcount}'] = PubIP
如果你使用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
问题是['pubipcount']
。在上下文中它只是一个字符串。我相信你想:
save['pubiplist'][save['pubipcount']] = PubIP
这样你就是指save['pubipcount']
中的值而不是字符串'pubipcount'
作为索引。
编辑:这可能会导致IndexError,因此使用append()
会更好
save['pubiplist'].append(PubIP)