【问题标题】:Python PostGreSql CSV Import empty field sorterPython PostGreSql CSV 导入空字段排序器
【发布时间】:2018-04-12 08:30:16
【问题描述】:

我正在尝试将一个相当大的 csv 文件(21 列/125k 行)导入 Postgresql。由于您不能像使用 Sqlite 那样将空字符串插入 Postgres。我正在尝试使用 csvDictReader 对每一行进行排序并过滤数据,以便为包含数据的列/归档创建插入语句。排序效果很好,但是当我尝试创建插入语句时,它会尝试插入数组而不是每个值...请不要建议其他方法,例如 Postgresql 的副本等。谢谢

with codecs.open(filename, 'rb', encoding='utf-8') as csvfile:
    reader = csv.DictReader(csvfile, delimiter='\t')
    a=0
    col=[]
    val=[]
    for row in reader:
        if a>0:
            for column, value in row.items():
                if value != '':
                    #print column, value
                    col.append(column)
                    val.append(value)
                        try:
                            c.execute('''INSERT INTO AMA (%s) VALUES (%s) ON CONFLICT DO NOTHING''',(col,val,))
                        except psycopg2.IntegrityError as e:
                            print e

                        col=[]
                        val=[]                          
                    a=a+1

psycopg2.ProgrammingError:“ARRAY”处或附近的语法错误 第 1 行:插入 AMA (ARRAY['fulfillment-id', 'sku', 'settleme...

设法走到了这一步,但现在出现了不同的问题:

with codecs.open(filename, 'rb', encoding='utf-8') as csvfile:
    reader = csv.DictReader(csvfile, delimiter='\t')
    a=0
    col=[]
    val=[]
    for row in reader:
        for column, value in row.items():
            if value != '':
                col.append(column)
                val.append(value)
                try:
                    query='''INSERT INTO AMA %s VALUES %s ON CONFLICT DO NOTHING'''
                    print c.mogrify(query, (tuple(col), tuple(val)))
                    c.execute(query, (tuple(col), tuple(val),))

                except psycopg2.IntegrityError as e:
                    print e

                col=[]
                val=[]                          
        a=a+1

psycopg2.ProgrammingError:“'currency'”处或附近的语法错误 LINE 1: INSERT INTO AMA ('currency', 'settlement-id', 'deposit-da

看起来我需要在 Postregsql 中的列名周围用“”而不是“”。我能做些什么来改变它?

找到一个可行的解决方案,如果有任何关于如何提高速度的想法,比如执行很多等等,请告诉我..

with codecs.open(filename, 'rb', encoding='utf-8') as csvfile:
    reader = csv.DictReader(csvfile, delimiter='\t')
        a=0
        col=[]
        val=[]
            for row in reader:
                for column, value in row.items():
                    if value != '':
                        col.append(column)
                        val.append(unicode(value, "utf8"))
                        try:
                            query1=sql.SQL("INSERT INTO AMA ({}) VALUES ({}) ON CONFLICT DO NOTHING").format(sql.SQL(', ').join(map(sql.Identifier, col)),sql.SQL(', ').join(sql.Placeholder() * len(col)))
                            query=c.mogrify(query1, tuple(val),)
                            #print query                    
                            c.execute(query)

                       except psycopg2.IntegrityError as e:
                            print e

                        col=[]
                        val=[]                          
                    a=a+1

【问题讨论】:

    标签: python postgresql sorting skip is-empty


    【解决方案1】:

    使用 psycopg2 的 SQL 函数可以创建正确格式的 sql,表在 " " 中,值在 ' ' 中,然后只需使用具有数据的表和值创建列表即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 2023-01-04
      相关资源
      最近更新 更多