PostgreSQL将csv写到表循环中途意外失败

时间:2019-05-01 02:06:08

标签: python python-3.x postgresql csv

我正在尝试遍历一系列CSV文件(所有文件都具有相同的表结构),并通过for循环读取每个CSV文件,并将其写入到postgresql表(与CSV文件相同的结构)中,并且迭代到下一个CSV文件。

我要遍历约600个CSV,并且我的for循环在前33个迭代中工作正常,但是由于某种原因,此后的每个迭代都会失败。

起初,我认为这是我在postgrgesql表中的字段上施加的约束的问题(即NOT NULL / UNIQUE约束)。但是,当我尝试通过Postico手动写入任何文件时,它们的提交没有任何问题(这也排除了任何数据类型不匹配是我认为的潜在原因?)。

import psycopg2
from lister import list_generator

conn = psycopg2.connect("host=localhost dbname=backend user=macbookpro")
cur = conn.cursor()

list = list_generator('testing.csv')

n = 0

for a in list:
    try:
        with open('Testing/'+ str(a) +'.csv', 'rb') as f:
            next(f)
            cur.copy_from(f, 'table1', sep=',')
            conn.commit()
            print(str(n) + " " + str(a) + " completed")
            n += 1
    except:
        print(str(n) + " " + str(a) + " failed")
        n += 1
        pass

1 个答案:

答案 0 :(得分:0)

原来,这是一个空值处理问题。从熊猫数据帧写入的CSV将NaN表示为“”。在copy_from语句中传递null =“”作为参数,并将一些数据类型从int更改为float即可解决此问题。