Пробелы в середине каждой строки в файле CSV - PullRequest
0 голосов
/ 01 июня 2018

У меня проблема с файлом 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 голосов
/ 01 июня 2018

Ваша проблема в том, что у csv-модуля writerows есть свой собственный "newline" -logic.Это мешает поведению новой строки по умолчанию open():

Исправить так:

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

Это также задокументировано в примере в документации: csv.writer (csvfile), dialect = 'excel', ** fmtparams) :

Если csvfile является файловым объектом, его следует открыть с помощью newline='' [1]

со ссылкой на сноску, говорящую вам:

[1] Если не указана новая строка = '', новые строки, встроенные в указанные поля, не будутинтерпретироваться правильно, и на платформах, которые используют \r\n linendings при записи, будет добавлен дополнительный \r.Всегда должно быть безопасно указывать newline = '', поскольку модуль csv выполняет свою собственную (универсальную) обработку новой строки.

Вы используете окна, которые используют \r\n, который добавляет еще один \ r, которыйприводит к «неправильному» выводу.


Полный код с некоторыми оптимизациями:

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()

Вывод:

9,3
16,10
15,6
[snipp lots of values]
13,14
13,7
20,4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...