作为网络工程师,我几天前就开始学习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
答案 0 :(得分:0)
TL; DR :问题在于您在每一步上都一遍又一遍地覆盖文件,可以将模式更改为'a'
,例如:
with open ('valid_ip.txt', 'a') as f_val:
...
with open ('invalid_ip.txt', 'a') as f_inval:
...
我们不需要while True
,f.readline()
和break
,因为f
是io.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一次写入所有结果,而不是一次又一次打开文件并每次只写一行。