Python 类型错误:';非类型';对象没有属性'__获取项目';pyipinfo
我正在尝试使用python工具Python 类型错误:';非类型';对象没有属性'__获取项目';pyipinfo,python,Python,我正在尝试使用python工具pyipinfo,从.txt文件中的IP列表中获取IP位置。我使用以下命令 $cat iptest.txt|ipinfo>iptest_location1.csv 显示以下错误: Traceback (most recent call last): File "/usr/local/bin/ipinfo", line 11, in <module> sys.exit(main()) File "/usr/local/lib/python2
pyipinfo
,从.txt
文件中的IP列表中获取IP位置。我使用以下命令
$cat iptest.txt|ipinfo>iptest_location1.csv
显示以下错误:
Traceback (most recent call last):
File "/usr/local/bin/ipinfo", line 11, in <module>
sys.exit(main())
File "/usr/local/lib/python2.7/dist-packages/ipinfo/__init__.py", line 45, in main
text += u'{}\t'.format(info[k])
TypeError: 'NoneType' object has no attribute '__getitem__'
如何解决此问题?如果
请求状态\u code
为200:
if req.status_code == 200:
return req.json()
如果请求状态\u code
不是200,您将返回什么
您没有显式的return语句,因此函数返回None
,您将其附加到ips\u info
:
for ip in ip_set:
ips_info.append(request_to_ipinfo(ip))
然后,在某个点上,您尝试从None
对象(它不是dict,而是NoneType
)获取info[k]
,当然您会得到“NoneType”对象没有属性“\uu getitem”
这就是你的问题。正确的解决方案取决于如果您没有得到
200
响应,您想做什么。在请求\u to\u ipinfo
函数中,如果请求状态\u code
为200,则返回req.json()
if req.status_code == 200:
return req.json()
如果请求状态\u code
不是200,您将返回什么
您没有显式的return语句,因此函数返回None
,您将其附加到ips\u info
:
for ip in ip_set:
ips_info.append(request_to_ipinfo(ip))
然后,在某个点上,您尝试从None
对象(它不是dict,而是NoneType
)获取info[k]
,当然您会得到“NoneType”对象没有属性“\uu getitem”
这就是你的问题。正确的解决方案取决于如果您没有得到
200
响应,您想做什么。问题是项目中的ipinfo.utils
,因为函数在另一个文件中,所以下面是我用Python 3.X编写的完整代码
from __future__ import print_function
from __future__ import absolute_import
import sys
import requests
import re
import os
import stat
def ip_list_from_string(string):
return re.findall(r'[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+', string)
def is_piped():
'''
script is called from a pipe
echo ip | ipinfo
'''
mode = os.fstat(0).st_mode
return stat.S_ISFIFO(mode)
def request_to_ipinfo(ip):
''' return a json from the request '''
full_url = 'http://ipinfo.io/{}'.format(ip)
headers = {'User-Agent': 'curl/7.30.0'}
req = requests.get(full_url, headers=headers)
if req.status_code == 200:
return req.json()
def main():
if is_piped():
input_string = sys.stdin.read()
ip_list = ip_list_from_string(input_string)
else:
ip_list = ['']
if ip_list == []:
exit()
ip_set = set(ip_list)
ips_info = []
for ip in ip_set:
ips_info.append(request_to_ipinfo(ip))
all_keys = [
'ip', 'city', 'region', 'country',
'hostname', 'org', 'postal', 'loc'
]
for info in ips_info:
text = ''
for k in all_keys:
try:
text += u'{}\t'.format(info[k])
except KeyError:
text += '\t'
print(text)
if __name__ == '__main__':
main()
问题是项目中的
ipinfo.utils
,因为函数在另一个文件中,所以下面是我用Python3.X编写的完整代码
from __future__ import print_function
from __future__ import absolute_import
import sys
import requests
import re
import os
import stat
def ip_list_from_string(string):
return re.findall(r'[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+', string)
def is_piped():
'''
script is called from a pipe
echo ip | ipinfo
'''
mode = os.fstat(0).st_mode
return stat.S_ISFIFO(mode)
def request_to_ipinfo(ip):
''' return a json from the request '''
full_url = 'http://ipinfo.io/{}'.format(ip)
headers = {'User-Agent': 'curl/7.30.0'}
req = requests.get(full_url, headers=headers)
if req.status_code == 200:
return req.json()
def main():
if is_piped():
input_string = sys.stdin.read()
ip_list = ip_list_from_string(input_string)
else:
ip_list = ['']
if ip_list == []:
exit()
ip_set = set(ip_list)
ips_info = []
for ip in ip_set:
ips_info.append(request_to_ipinfo(ip))
all_keys = [
'ip', 'city', 'region', 'country',
'hostname', 'org', 'postal', 'loc'
]
for info in ips_info:
text = ''
for k in all_keys:
try:
text += u'{}\t'.format(info[k])
except KeyError:
text += '\t'
print(text)
if __name__ == '__main__':
main()