Python csv文件中每行中间的空格
我的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:
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