首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中从文本文件读取/ with多个ip地址的问题

问在python中从文本文件读取/ with多个ip地址的问题
EN

Stack Overflow用户
提问于 2016-04-18 00:12:31
回答 2查看 862关注 0票数 1

我刚刚开始学习Python,并坚持以下问题。我有一个简单的程序,可以从文本文件中读取ip地址并检查ICMP的可达性。当文本文件中只有一个IP地址时,我对程序没有问题,但是,一旦我在文本文件中添加超过1个IP地址,我的程序就不能工作。看起来有1个以上的地址,windows ping实用程序甚至无法理解IP地址并尝试解析名称。

读取文件并检查ICMP的示例代码:

代码语言:javascript
复制
def  validate_ip():
    global ip_add_list

     check = False


    while True:
        try:

            ip_file = raw_input("Enter the file name and extension:")
            selected_ip_file = open(ip_file,'r')
            selected_ip_file.seek(0)
            ip_add_list = selected_ip_file.readlines()
            selected_ip_file.close()

        #print ip_add_list
        except IOError:
            print"*File %s doesn't exist, try again" % ip_file
            continue
    check2 = False
    while True:
        for ip in ip_add_list:
           print ip
           ping_reply = subprocess.call(['ping','-n','5','-w','1000','-a',ip])
           if ping_reply == 0:
               check2 = True
               print "pings completed"


           else:
               check2 = False
               break
    if check2 == True:
        break
    elif check2 == False:
        print"Some or all ip(s) in the file are not reachable, please check and try again"
        validate_ip()

我有一个简单的文本文件,地址如下。

4.2.2.2

8.8.8.8

我可以从命令提示符ping这些地址,但不能从程序ping这些地址。

这是我从程序pinging时得到的错误。

Ping请求找不到主机4.2.2.2。请检查名称,然后重试。文件中的部分或全部ip不可访问,请检查并重试

(看起来好像不明白4.2.2.2已经是IP了)

只要我从文本文件中删除第二个地址并再次运行,我就能够ping通4.2.2.2。

EN

回答 2

Stack Overflow用户

发布于 2016-04-20 13:53:49

由于文件中存在空格,IP地址在程序中无法识别为有效地址。感谢cdarke提供了下面的解决方案。

“您可能会在每个IP地址后追加一个换行符。在subprocess.call中尝试ip.rstrip()”

roadrunner66,我也很感谢你在这个问题上的帮助和提供的解决方案。

票数 1
EN

Stack Overflow用户

发布于 2016-04-18 00:55:36

注意:这个问题很可能是ping-a-site-in-python的翻版。

要使代码具有可读性,请将其转换为如下所示的块。归功于python-read-file-line-by-line-into-array。SO question ping-a-site-in-python还讨论了ping的替代方法。

代码语言:javascript
复制
import subprocess

def validate_ips_from_file(filename):
    lines = [line.rstrip('\n') for line in open('filename')]
    validate_ips(lines)

def validate_ips(ipaddresses):
        for ip in ipaddresses:
            ping_reply=validate_ip(ip)
            print ip, ping_reply

def validate_ip(ipaddress):
    ping_reply = subprocess.call(['ping','-c','5','-w','1000','-a',ipaddress])
    #https://en.wikipedia.org/wiki/Ping_(networking_utility)    
    return ping_reply

validate_ips(['www.nytimes.com','www.theregister.co.uk','www.stackoverflow.com'])

输出:

代码语言:javascript
复制
www.nytimes.com 1
www.theregister.co.uk 1
www.stackoverflow.com 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36678957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档