文件csv中每行中间的空格

时间:2018-06-01 19:12:06

标签: python python-3.x file csv

我的文件csv有问题。它在每行中间用空格保存。我不知道为什么。我该如何解决这个问题?我问,因为我找不到任何答案和解决方案。

以下是代码:

import csv
import random

def dict_ID_aeropuertos():
  with open('AeropuertosArg.csv') as archivo_csv:
    leer = csv.reader(archivo_csv)
    dic_ID = {}
    for linea in leer:
      dic_ID.setdefault(linea[0],linea[1])
  archivo_csv.close()
  return dic_ID

def ruteoAleatorio():
  dic_ID = dict_ID_aeropuertos()
  lista_ID = list(dic_ID.keys())
  cont = 0
  lista_rutas = []
  while (cont < 50):
    r1 = random.choice(lista_ID)
    r2 = random.choice(lista_ID)
    if (r1 != r2):
      t = (r1,r2)
      if (t not in lista_rutas):
        lista_rutas.append(t)
        cont += 1

  with open('rutasAeropuertos.csv', 'w') as archivo_rutas:
    escribir = csv.writer(archivo_rutas)
    escribir.writerows(lista_rutas)

  archivo_rutas.close()

ruteoAleatorio()

这是文件csv AeropuertosArg.cvs:

1,Aeroparque Jorge Newbery,Ciudad Autonoma de Buenos Aires,Ciudad Autonoma de Buenos Aires,-34.55803,-58.417009
2,Aeropuerto Internacional Ministro Pistarini,Ezeiza,Buenos Aires,-34.815004,-58.5348284
3,Aeropuerto Internacional Ingeniero Ambrosio Taravella,Cordoba,Cordoba,-31.315437,-64.21232
4,Aeropuerto Internacional Gobernador Francisco Gabrielli,Ciudad de Mendoza,Mendoza,-32.827864,-68.79849
5,Aeropuerto Internacional Teniente Luis Candelaria,San Carlos de Bariloche,Rio Negro,-41.146714,-71.16203
6,Aeropuerto Internacional de Salta Martin Miguel de Guemes,Ciudad de Salta,Salta,-24.84423,-65.478412
7,Aeropuerto Internacional de Puerto Iguazu,Puerto Iguazu,Misiones,-25.731778,-54.476181
8,Aeropuerto Internacional Presidente Peron,Ciudad de Neuquen,Neuquen,-38.952137,-68.140484
9,Aeropuerto Internacional Malvinas Argentinas,Ushuaia,Tierra del Fuego,-54.842237,-68.309701
10,Aeropuerto Internacional Rosario Islas Malvinas,Rosario,Santa Fe,-32.916887,-60.780391
11,Aeropuerto Internacional Comandante Armando Tola,El Calafate,Santa Cruz,-50.283977,-72.053641
12,Aeropuerto Internacional General Enrique Mosconi,Comodoro Rivadavia,Chubut,-45.789435,-67.467498
13,Aeropuerto Internacional Teniente General Benjamin Matienzo,San Miguel de Tucuman,Tucuman,-26.835888,-65.108361
14,Aeropuerto Comandante Espora,Bahia Blanca,Buenos Aires,-38.716152,-62.164955
15,Aeropuerto Almirante Marcos A. Zar,Trelew,Chubut,-43.209957,-65.273405
16,Aeropuerto Internacional de Resistencia,Resistencia,Chaco,-27.444926,-59.048739
17,Aeropuerto Internacional Astor Piazolla,Mar del Plata,Buenos Aires,-37.933205,-57.581518
18,Aeropuerto Internacional Gobernador Horacio Guzman,San Salvador de Jujuy,Jujuy,-24.385987,-65.093755
19,Aeropuerto Internacional Piloto Civil Norberto Fernandez,Rio Gallegos,Santa Cruz,-51.611788,-69.306315
20,Aeropuerto Domingo Faustino Sarmiento,San Juan,San Juan,-31.571814,-68.422568

1 个答案:

答案 0 :(得分:2)

你的问题是,csv-module writerows有自己的“换行符”-logic。它会干扰open()的默认换行符:

像这样修复:

with open('rutasAeropuertos.csv', 'w', newline='' ) as archivo_rutas:
#                                      ^^^^^^^^^^

文档中的示例中也记录了这一点:csv.writer(csvfile, dialect='excel', **fmtparams)

  

如果 csvfile 是文件对象,则应使用newline=''打开[1]

带有脚注的链接告诉您:

  

[1] 如果未指定newline ='',则无法正确解释嵌入在引用字段中的换行符,并且在使用\r\n换行符的平台上写入额外的{{ 1}}将被添加。指定newline =''应始终是安全的,因为csv模块会执行自己的(通用)换行处理。

您正在使用使用\r的窗口,这会添加另一个\ r \ n,导致您的“错误”输出。

完整代码并进行了一些优化:

\r\n

输出:

import csv
import random

def dict_ID_aeropuertos():
  with open('AeropuertosArg.csv') as archivo_csv:
    leer = csv.reader(archivo_csv)
    dic_ID = {}
    for linea in leer:
      dic_ID.setdefault(linea[0],linea[1]) 
  return dic_ID

def ruteoAleatorio():
  dic_ID = dict_ID_aeropuertos()
  lista_ID = list(dic_ID.keys())
  lista_rutas = set()            # a set only holds unique values 
  while (len(lista_rutas) < 50): # simply check the length of the set
    r1,r2 = random.sample(lista_ID, k=2)  # draw 2 different ones
    lista_rutas.add( (r1,r2) )            # you can not add duplicates, no need to check    
  with open('rutasAeropuertos.csv', 'w', newline='' ) as archivo_rutas:
    escribir = csv.writer(archivo_rutas)
    escribir.writerows(lista_rutas)

ruteoAleatorio()