Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类型错误:';非类型';对象没有属性'__获取项目';pyipinfo_Python - Fatal编程技术网

Python 类型错误:';非类型';对象没有属性'__获取项目';pyipinfo

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

我正在尝试使用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.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()