Python生成IP地址导出CSV出现多余引号问题求助
CSV导出多余引号问题解决方案
问题说明
编写Python代码批量生成IP地址并导出为CSV文件后,发现文件中出现不必要的嵌套引号。原代码及调用方式如下:
原代码
import csv import ipaddress import random from random import shuffle LAN = ipaddress.ip_network('192.168.0.0/16') WAN1 = ipaddress.ip_network('11.10.8.0/22') WAN2 = ipaddress.ip_network('12.10.8.0/22') LAN_IP_Adresses = [ IP_LAN for IP_LAN in LAN.hosts()] WAN1_IP_Adresses = [ IP_WAN1 for IP_WAN1 in WAN1.hosts()] WAN2_IP_Adresses = [ IP_WAN2 for IP_WAN2 in WAN2.hosts()] index_IP_GW = len(WAN1_IP_Adresses)-1 locations_list=['Abidjan','Abu Dhabi','Adana','Adelaide', 'Ahmadabad','Algiers','Amsterdam','Ankara','Anshan','Athens','BANGKOK','BUCHAREST','BUDAPEST','Bagdad','Bandung','Bangalore','Bangkok','Barcelona','Beirut','Belgrade','Bern','Bogota','Brasilia','Brazzaville','Brussels','Bursa','CAIRO','CARACAS','CONAKRY','Canberra','Casablanca','Changchun','Chengdu','Chicago','Copenhagen','Dakar','MINSK','Madrid','Medina','Nairobi','Napoli','Montreal', 'Odessa','Omdurman','Osaka','Ottawa','PYONGYANG','Paris','Pekin', 'Perth','Philadelphia','Phoenix','Pimpri Chinchwad','Porto','Porto Alegre','QUITO','Qingdao','Rabat','Rajkot','Riadh','Rio de Janeiro','Rome','SANTIAGO','Salvador','Samara','San Antonio','San Francisco','Sao Paulo','Sendai','Seongnam','Seoul','Shanghai','Singapore','Sydney','Taiyuan','Tehran','Tijuana','Tokyo','Toronto','Moscou','Moscow','Mumbai (Bombay)','Munich','México','Milan', 'Tripoli','Tunis','Vienna','Warsaw','Wuhan','Xian','Yaounde','Yokohama', 'Zapopan','hong kong','Dallas','Delhi','Doha','Dublin','Durban','Ecatepec','Frankfurt','Fukuoka','Giza','Hamburg','Havana','Helsinki','Houston','Hyderabad','Istanbul','Jaipur','Jakarta','Jeddah','Johannesburg','KIEV','Kaduna','Kano','Kazan','Kuala Lumpur''Kyoto','LUANDA','Lahore','Lanzhou','Le Caire','Leon','Lima','Lisbon','London','Los Angeles','Lyon','MANILA','Melbourne','New York'] def initial_Sites_list_generator(filename='SITES_CI.csv', Number_of_Sites=1000): file_to_output = open(filename,'w',newline='') csv_writer = csv.writer(file_to_output,delimiter=',') Site_Nbr=1 index = 0 csv_writer.writerow(["SITE_NAME", "SERIAL_NUMBER",'"LAN_IP_ADDRESS"','"WAN_IP_ADDRESS1"','"WAN_IP_ADDRESS2"','"GATEWAY_IP_ADDRESS1"','"GATEWAY_IP_ADDRESS2"','"ROUTE_REFLECTOR"','"LOCATIONS"','"HARDWAREMODEL"','"LANINT"','"WANINT1"','"WANINT2"','"BW_OUT"','"BW_IN"']) for i in range(1,Number_of_Sites+1): shuffle(locations_list) location = random.choice(locations_list) csv_writer.writerow(['"SITE'+ str(Site_Nbr)+'"',"2e70129bde9c4426b9213d4408c300",f'"{(LAN_IP_Adresses[index])}"',f'"{str(WAN1_IP_Adresses[index])}"',f'"{str(WAN2_IP_Adresses[index])}"',f'"{str(WAN1_IP_Adresses[index_IP_GW])}"',f'"{str(WAN2_IP_Adresses[index_IP_GW])}"','"False"',f'"{location}"','"ONEv600"','"gigabitethernet0/2"','"gigabitethernet0/0"','"gigabitethernet0/1"','"10"','"20"']) Site_Nbr = Site_Nbr+1 index = index+1 file_to_output.close()
原调用代码
initial_Sites_list_generator('SITES_OVP.csv', 1000)
问题原因
Python的csv.writer会自动识别需要引号包裹的字段(比如包含逗号、换行符的内容)并添加引号。但你手动给表头和每行数据的字段添加了双引号,导致csv.writer将这些手动添加的引号当作字段内容的一部分,再次添加外层引号,最终出现嵌套引号的问题。
修改后的代码
去掉所有手动添加的双引号,让csv.writer自动处理格式:
import csv import ipaddress import random from random import shuffle LAN = ipaddress.ip_network('192.168.0.0/16') WAN1 = ipaddress.ip_network('11.10.8.0/22') WAN2 = ipaddress.ip_network('12.10.8.0/22') LAN_IP_Adresses = [IP_LAN for IP_LAN in LAN.hosts()] WAN1_IP_Adresses = [IP_WAN1 for IP_WAN1 in WAN1.hosts()] WAN2_IP_Adresses = [IP_WAN2 for IP_WAN2 in WAN2.hosts()] index_IP_GW = len(WAN1_IP_Adresses)-1 locations_list=['Abidjan','Abu Dhabi','Adana','Adelaide', 'Ahmadabad','Algiers','Amsterdam','Ankara','Anshan','Athens','BANGKOK','BUCHAREST','BUDAPEST','Bagdad','Bandung','Bangalore','Bangkok','Barcelona','Beirut','Belgrade','Bern','Bogota','Brasilia','Brazzaville','Brussels','Bursa','CAIRO','CARACAS','CONAKRY','Canberra','Casablanca','Changchun','Chengdu','Chicago','Copenhagen','Dakar','MINSK','Madrid','Medina','Nairobi','Napoli','Montreal', 'Odessa','Omdurman','Osaka','Ottawa','PYONGYANG','Paris','Pekin', 'Perth','Philadelphia','Phoenix','Pimpri Chinchwad','Porto','Porto Alegre','QUITO','Qingdao','Rabat','Rajkot','Riadh','Rio de Janeiro','Rome','SANTIAGO','Salvador','Samara','San Antonio','San Francisco','Sao Paulo','Sendai','Seongnam','Seoul','Shanghai','Singapore','Sydney','Taiyuan','Tehran','Tijuana','Tokyo','Toronto','Moscou','Moscow','Mumbai (Bombay)','Munich','México','Milan', 'Tripoli','Tunis','Vienna','Warsaw','Wuhan','Xian','Yaounde','Yokohama', 'Zapopan','hong kong','Dallas','Delhi','Doha','Dublin','Durban','Ecatepec','Frankfurt','Fukuoka','Giza','Hamburg','Havana','Helsinki','Houston','Hyderabad','Istanbul','Jaipur','Jakarta','Jeddah','Johannesburg','KIEV','Kaduna','Kano','Kazan','Kuala Lumpur','Kyoto','LUANDA','Lahore','Lanzhou','Le Caire','Leon','Lima','Lisbon','London','Los Angeles','Lyon','MANILA','Melbourne','New York'] def initial_Sites_list_generator(filename='SITES_CI.csv', Number_of_Sites=1000): # 使用with语句自动管理文件,避免手动关闭 with open(filename,'w',newline='') as file_to_output: csv_writer = csv.writer(file_to_output,delimiter=',') Site_Nbr=1 index = 0 # 表头去掉手动添加的双引号 csv_writer.writerow(["SITE_NAME", "SERIAL_NUMBER", "LAN_IP_ADDRESS", "WAN_IP_ADDRESS1", "WAN_IP_ADDRESS2", "GATEWAY_IP_ADDRESS1", "GATEWAY_IP_ADDRESS2", "ROUTE_REFLECTOR", "LOCATIONS", "HARDWAREMODEL", "LANINT", "WANINT1", "WANINT2", "BW_OUT", "BW_IN"]) for i in range(1,Number_of_Sites+1): shuffle(locations_list) location = random.choice(locations_list) # 每行数据去掉手动添加的双引号 csv_writer.writerow([ f'SITE{Site_Nbr}', "2e70129bde9c4426b9213d4408c300", str(LAN_IP_Adresses[index]), str(WAN1_IP_Adresses[index]), str(WAN2_IP_Adresses[index]), str(WAN1_IP_Adresses[index_IP_GW]), str(WAN2_IP_Adresses[index_IP_GW]), "False", location, "ONEv600", "gigabitethernet0/2", "gigabitethernet0/0", "gigabitethernet0/1", "10", "20" ]) Site_Nbr += 1 index += 1
调用代码保持不变:
initial_Sites_list_generator('SITES_OVP.csv', 1000)
额外优化说明
- 使用
with语句管理文件,无需手动调用close(),即使代码抛出异常也能保证文件正常关闭,提升代码安全性。
内容的提问来源于stack exchange,提问作者sunny
相关产品推荐
相关产品推荐

