Python:将CSV文件中的值写入PostgreSQL数据库

时间:2018-11-26 14:04:16

标签: python postgresql pandas csv

我制作了一个python脚本,该脚本接受一个excel文件,并将其转换为一个csv文件。我的问题是我的csv中有多个需要为空的空值,但是当我尝试将其插入数据库时​​,出现此错误

psycopg2.DataError: invalid input syntax for type date: "None"
LINE 1: ...', 'Some info here', 'And some more', '1995-09-06', 'None'

这是我编写的将excel文件转换为CSV的代码

def excel_to_csv():
    xlsx = pd.read_excel(excel_path + fileName + '.xlsx')
    xlsx.to_csv(csv_file, encoding='utf-8', index=False, na_rep=None, quoting=csv.QUOTE_NONE)


    excel_to_csv()

当我检查CSV文件时,所有内容均已正确格式化,其值由分隔,并且null值为None,不带引号。当我尝试读取CSV文件并将其插入数据库时​​,似乎开始出现问题。我为此使用csv.reader

with open(csv_file, 'rb') as f:
    reader = csv.reader(f, delimiter=',', quoting=csv.QUOTE_NONE)
    next(reader)
    for row in reader:
        cur.execute(
            "INSERT INTO databasetable (foo, foo2, foo3, foo4) VALUES (%s, %s, %s, %s);",
            row
        )

有人知道这是怎么回事吗?

2 个答案:

答案 0 :(得分:1)

编辑:我看到CSV阅读器为您提供了字符串列表,因此我正在相应地编辑示例

Postgres无法识别"None"(但是您的sql API显然可以识别None。)您可以尝试将所有"None"替换为None。像这样:

for row in reader:
    clean_row = []
    for x in row:
        if x == 'None':
             clean_row.append(None)
        else:
             clean_row.append(x)
    cur.execute(
            "INSERT INTO databasetable (foo, foo2, foo3, foo4) VALUES (%s, %s, %s, %s);",
            clean_row
        )

答案 1 :(得分:0)

我的想法是,您需要将其设置为NULL,而不是None。参见:postgresql insert null value on query