文件cs中每行中间的空格

2024-09-26 18:04:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我的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

Tags: csvidderandomsandiclistalinea
1条回答
网友
1楼 · 发布于 2024-09-26 18:04:01

您的问题是,csv模块writerows有自己的“换行”逻辑。它会干扰open()的默认换行行为:

修正如下:

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

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

If csvfile is a file object, it should be opened with newline='' [1]

一个脚注的链接告诉你:

[1] If newline='' is not specified, newlines embedded inside quoted fields will not be interpreted correctly, and on platforms that use \r\n linendings on write an extra \r will be added. It should always be safe to specify newline='', since the csv module does its own (universal) newline handling.

您使用的windows确实使用了\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

相关问题 更多 >

    热门问题