Python:在循环编写时扩展文件内容

时间:2018-07-17 09:10:27

标签: python python-3.x file-io try-catch

作为网络工程师,我几天前就开始学习python,首先,我想编写代码来检查给定文件中的有效和无效IP地址,然后将它们保存到单独的文件中。

文件打开和检查按预期工作,但我无法将有效和无效IP保存到其他txt中。

import socket


def ip_check():
  with open('ip.txt', 'r') as f:
    while True:
      output = f.readline()
      try:
        socket.inet_aton(output)
        with open ('valid_ip.txt', 'w') as f_val:
          f_val.write(output)
      except socket.error:
        with open ('invalid_ip.txt', 'w') as f_inval:
          f_inval.write(output)
      if not output: break

ip_check()

IP.txt的片段:

82.102.177.55
200.61.155.203
342.2.52.1
125.42.75.52
0.0.0.0
256.34.2.5
71.30.186.48
128.72.94.197

1 个答案:

答案 0 :(得分:0)

TL; DR :问题在于您在每一步上都一遍又一遍地覆盖文件,可以将模式更改为'a',例如:

with open ('valid_ip.txt', 'a') as f_val:
    ...
with open ('invalid_ip.txt', 'a') as f_inval:
    ...

改进

  • 我们不需要while Truef.readline()break,因为fio.TextIOWrapper的实例,而io.IOBase是{的子类{3}}和docs来的

      

    IOBase (及其子类)支持迭代器协议,这意味着可以对 IOBase 对象进行迭代,以产生流中的行。

    这意味着我们可以直接通过f而不是

    进行迭代
    while True:
        output = f.readline()
        ...
        if not output: break
    

    for output in f:
        ...
    
  • 我们可以首先收集数据(例如,将数据存储在list中),然后再将数据写入文件中。

  • 我们可以将try-except中的逻辑提取到谓词中,以检查给定ip是否有效,如:

    import socket
    
    
    def is_ip_valid(ip):
        try:
            socket.inet_aton(ip)
        except socket.error:
            return False
        else:
            return True
    

最后我们可以拥有类似的东西

def ip_check():
    valid_ips = []
    invalid_ips = []
    with open('ip.txt', 'r') as f:
        for output in f:
            if is_ip_valid(output):
                valid_ips.append(output)
            else:
                invalid_ips.append(output)
    with open('valid_ip.txt', 'w') as f_val:
        f_val.writelines(valid_ips)
    with open('invalid_ip.txt', 'w') as f_inval:
        f_inval.writelines(invalid_ips)

在我看来more readable

请注意,模式再次更改为'w',因为我们使用writelines method一次写入所有结果,而不是一次又一次打开文件并每次只写一行。

进一步阅读