你的问题是,csv-模块writerows有自己的“换行符”-逻辑。它会干扰默认的换行符行为。open(): 像这样修正: with open('rutasAeropuertos.csv', 'w', newline='' ) as archivo_rutas:
# ^^^^^^^^^^ 在文档中的示例中也记录了这一点 如果csv文件是一个文件对象,应该用newline='' 有一个脚注的链接告诉你: 一如果未指定newline=‘,则嵌入在引号字段中的换行符将无法正确解释,并且在使用\r\n写一个额外的行\r将被添加。指定newline=‘应该是安全的,因为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() 产出: 9,3
16,10
15,6
[snipp lots of values]
13,14
13,7
20,4... 展开详请
CSV格式使用逗号分隔值,包含回车符,换行符,逗号或双引号的值用双引号括起来。包含双引号的值被引用,并且每个文字引号都被紧接的前面的引号转义:例如,3个值:
test
list, of, items
"go" he said
将被编码为:
test
"list, of, items"
"""go"" he said"
任何字段都可以被引用,但只有包含逗号,CR / NL或引号的字段必须被引用。
CSV格式没有真正的标准,但几乎所有的应用程序都遵循这里记录的约定。在其他地方提到的RFC不是CSV的标准,它是在MIME中使用CSV的RFC,并包含一些非常规和不必要的限制,使其在MIME之外无用。
我见过的很多CSV模块都不能容纳的一个问题是,多行可以在单个字段中编码,这意味着您不能假定每行都是单独的记录,您可能不需要在您的数据或准备处理这个... 展开详请
一个快速的方法是使用Python库(版本0.15或更高)。这将处理为你创建列 - 尽管显然它为数据类型所做的选择可能不是你想要的。如果它不完全符合你的要求,你总是可以使用生成的“创建表”代码作为模板。
这是一个简单的例子:
import pandas as pd
df = pd.read_csv('mypath.csv')
df.columns = [c.lower() for c in df.columns] #postgres doesn't like capitals or spaces
from sqlalchemy import create_engine
engine = create_engine('postgresql://username:password@localhost:5432/dbname')
df.to_sql("my_table_name", engine)
下面是一些代码,告诉你如何设置各种选项:
#Set is so the raw sql output is logged
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
df.to_sql("my_table_name2",
engine,
if_exists="append", #options are ‘fail’, ‘replace’, ‘append’, default ‘fail’
index=False, #Do not output the index of the dataframe
dtype={'col1': sqlalchemy.types.NUMERIC,
'col2': sqlalchemy.types.String}) #Datatypes should be [sqlalchemy types][1]... 展开详请