循环写入CSV时仅保留最后一条系统数据的问题排查
解决CSV文件仅保留最后一组数据的问题
问题根源
你在遍历每个硬件系统的循环内部,每次都用open('ports.csv', 'w')打开文件——w模式会直接清空原有文件并重新创建,导致前25个系统的数据全部被最后一次循环的文件初始化操作覆盖,最终只留下最后一个系统的数据。同时重复打开文件写入单条数据的操作既冗余又容易出问题。
修复后的代码
import requests import json import urllib3 import csv import os urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 先初始化CSV文件,只写一次表头 header = ['Array', 'FCS_port', 'WWN'] with open('ports.csv', 'w', encoding='UTF8', newline="") as f: writer = csv.writer(f) writer.writerow(header) # 遍历所有硬件系统 with open('arrays.txt', 'r') as f: for line in f: data = line.strip() s1 = str(data) # 认证请求 token_url = "https://{}/api/1.17/auth/apitoken".format(s1) payload = {'username': 'user', 'password': 'password'} headers = {'Content-Type': 'application/json'} response = requests.request("POST", token_url, data=json.dumps(payload), headers=headers, verify=False, timeout=3000) token = response.text # 建立会话 session = requests.Session() sessionUrl = "https://{}/api/1.17/auth/session".format(s1) payload = response.text response = session.request("POST", sessionUrl, data=payload, headers=headers, verify=False, timeout=3000) # 获取端口信息 baseUrl = "https://{}/api/1.17/port".format(s1) response = session.request("GET", baseUrl, headers=headers, verify=False, timeout=3000) info = json.loads(response.content) # 追加当前系统的端口数据到CSV with open('ports.csv', 'a', newline='') as p: writer = csv.writer(p) for i in info: portI = (s1, i['name'], i['wwn']) writer.writerow(portI) print(portI)
关键修改点
- 将CSV文件的表头写入操作移到系统循环外部,仅执行一次,避免重复清空文件。
- 每个系统的数据统一用
a(追加)模式写入,确保所有数据都追加到文件末尾,不会被覆盖。 - 优化了数据写入逻辑,每个系统只打开一次文件写入所有数据,减少IO操作次数。
内容的提问来源于stack exchange,提问作者grinner30
相关产品推荐
相关产品推荐

