Python读取CSV文件并SSH连接路由器时的换行符处理问题求助
这个问题我太熟了!Windows风格的\r\n换行符确实会搞砸SSH连接——Netmiko会把带换行的字符串当作主机名/IP去尝试连接,肯定会失败。给你几个简单有效的解决办法:
方法1:用strip()快速去除首尾空白字符
这是最直接的修复方式,每次读取行之后,用strip()把换行符、空格这些干扰字符统统去掉:
nodenum=1 import csv from netmiko import ConnectHandler f=open('Routers.csv', 'r') #包含主机名的文件 c=f.readlines() with open('Output.csv','w', newline='') as f: # 改用w模式+newline=''避免空行 write = csv.writer(f) write.writerow(['Hostname', "Cellular"]) for i in c : # 去除首尾的\r\n、空格、制表符等空白字符 host = i.strip() print ("Node", nodenum, "...Checking IP Address...", host) try: Connection = netmiko.ConnectHandler(ip=host, device_type="cisco_ios" , username="y", password="x", verbose=False) # 这里可以添加获取设备信息、写入结果的逻辑 Connection.disconnect() # 用完记得断开连接 except Exception as e: print(f"Node {nodenum} 连接失败: {str(e)}") nodenum +=1
strip()会自动清理字符串首尾所有空白类字符,完美解决你的换行符问题。
方法2:用csv.reader规范读取CSV文件
直接用readlines()读CSV其实不太专业,尤其是如果你的CSV以后可能增加列的话。用csv.reader会自动处理每行格式,包括换行符:
nodenum=1 import csv from netmiko import ConnectHandler # 用csv.reader读取,自动处理行分隔和列分割 with open('Routers.csv', 'r') as in_f: csv_reader = csv.reader(in_f) # 如果你的CSV有表头,先跳过:next(csv_reader) with open('Output.csv','w', newline='') as out_f: write = csv.writer(out_f) write.writerow(['Hostname', "Cellular"]) for row in csv_reader: # 假设每行第一个元素是主机名/IP,保险起见再加strip host = row[0].strip() print ("Node", nodenum, "...Checking IP Address...", host) try: Connection = ConnectHandler(ip=host, device_type="cisco_ios" , username="y", password="x", verbose=False) # 示例:获取Cellular信息并写入 cellular_data = Connection.send_command("show cellular 0/0/0 status") write.writerow([host, cellular_data]) Connection.disconnect() except Exception as e: write.writerow([host, f"连接失败: {str(e)}"]) print(f"Node {nodenum} 连接失败: {e}") nodenum +=1
这种方式不仅解决了换行符问题,还能更好地适配CSV的格式变化,是处理CSV文件的标准姿势。
额外小提示
- 一定要处理异常:连接失败时把错误信息写入输出文件,方便后续排查问题
- SSH连接用完记得
disconnect(),避免占用不必要的资源
内容的提问来源于stack exchange,提问作者JOD
相关产品推荐
相关产品推荐

