簡體   English   中英

Python PostgreSQL CSV 導入空字段排序器

[英]Python PostgreSQL CSV Import empty field sorter

我正在嘗試將一個相當大的 csv 文件(21 列/125k 行)導入 Postgres。 由於您不能像使用 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 行或附近出現語法錯誤:INSERT INTO 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'”處或附近出現語法錯誤第 1 行:INSERT INTO AMA ('currency', 'settlement-id', 'deposit-da

看起來我需要在 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:
                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

使用 psycopg2 的 SQL 函數,可以創建正確格式的 sql,表在“”中,值在 '' 中,然后只需使用具有數據的表和值創建列表即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM