Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python csv文件中每行中间的空格_Python_Python 3.x_File_Csv - Fatal编程技术网

Python csv文件中每行中间的空格

Python csv文件中每行中间的空格,python,python-3.x,file,csv,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:

我的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模块
writerows
有自己的“换行”逻辑。它会干扰
open()
的默认换行行为:

修正如下:

with open('rutasAeropuertos.csv', 'w', newline='' ) as archivo_rutas:
#                                      ^^^^^^^^^^
这也记录在文档中的示例中:

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

通过一个脚注的链接告诉您:

[1]如果未指定换行符='',则嵌入在引号字段中的换行符将无法正确解释,并且在使用
\r\n
linendings on write的平台上,将添加额外的
\r
。指定换行符=''应该总是安全的,因为csv模块有自己的(通用)换行符处理

您使用的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()

你能在问题中添加几行
AeropuertosArg.csv
的内容吗?@DavisYoshida当然可以!这是没有意义的:
archivo\u csv.close()
with语句autocloses…在初始csv中可能有额外的空格
dic_ID.setdefault(linea[0],linea[1])
可以是
dic_ID.setdefault(linea[0].strip(),linea[1].strip())
。但是,这只是一种奇怪的方式来执行
dic_ID[linea[0].strip()]=linea[1].strip()
。但是你最终只使用了键(第0行),那么为什么还要在一个集合可以使用的时候使用一个
dict
呢?
r1=random.choice(lista\u ID)
r2=random.choice(lista\u ID)写为
r1,r2=random.sample(lista\u ID,k=2)
-除非列表ID中有重复的值,否则它们永远不会相同<代码>示例在不将值替换回列表的情况下获取值。非常感谢您的帮助。我从你的回答中学到了很多。显然,这就是问题的解决办法。
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