Python3中open函数与for循环内输出不一致问题排查与修复
问题原因及修复方案
嘿,这个换行错位的问题其实很好解释:
为什么会出现额外换行?
当你用for IPAddr in f逐行读取ip.txt时,每一行的末尾都会自带换行符\n——除非是文件的最后一行恰好没有换行。比如你读取到的前两行内容其实是"127.0.0.1\n"和"10.0.0.1\n",当你用print(f'{IPAddr} is up')输出时,IPAddr里的\n会先把IP打印出来,然后自动换行,再打印后面的is up,就出现了IP和状态分开两行的情况。而第三行因为是文件最后一行,没有额外的换行符,所以输出正常。
怎么修复?
只需要在使用IPAddr之前,把末尾的换行符去掉就行,这里有几种靠谱的方式:
IPAddr = IPAddr.strip():移除字符串首尾所有空白字符(包括换行、空格、制表符,适合处理可能带空格的IP行)IPAddr = IPAddr.rstrip("\n"):精准只移除末尾的换行符(如果行首有空格不想去掉的话用这个)IPAddr = IPAddr.replace('\n',''):替换掉所有换行符(适合确定只有末尾有换行的场景)
另外还要提个小问题:原代码里stdout=f是错误的,你把ping的输出重定向到了正在读取的文件f,这会导致文件内容混乱,应该改成stdout=subprocess.PIPE(如果不需要捕获输出,也可以用stdout=subprocess.DEVNULL直接丢弃)。
修改后的完整代码
import subprocess with open('ip.txt') as f: for IPAddr in f: # 移除首尾空白字符,处理换行问题 IPAddr = IPAddr.strip() # 跳过空行(如果文件里有的话) if not IPAddr: continue # 修复stdout的错误,避免文件混乱 ping = subprocess.Popen(['ping','-c','1',IPAddr], stdout=subprocess.PIPE, stderr=subprocess.PIPE).wait() if ping == 0: print(f'{IPAddr} is up') else: print(f'{IPAddr} is down')
内容的提问来源于stack exchange,提问作者user9013730
相关产品推荐
相关产品推荐

