【问题标题】:Postgresql write csv to table loop failing unexpectedly mid-loopPostgresql 将 csv 写入表循环在循环中意外失败
【发布时间】:2019-05-01 02:06:07
【问题描述】:

我正在尝试遍历一系列 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

【问题讨论】:

  • 失败时会收到什么错误信息?
  • 因为我将它嵌套在 try/except 块中,所以我得到的消息是在 except 块中指定的打印语句。让我删除 try/except 块,我会更新。谢谢尼克。
  • 看起来毕竟是数据类型错误。引发以下错误:psycopg2.DataError:类型双精度的无效输入语法:“”。奇怪的是,手动导入时不会发生数据类型错误,不是吗?

标签: python python-3.x postgresql csv


【解决方案1】:

原来这是一个空值处理问题。从 pandas 数据帧写入的 CSV 将 NaN 写为“”。在 copy_from 语句中将 null="" 作为参数传递并将一些数据类型从 int 更改为 float 解决了该问题。

【讨论】:

    猜你喜欢
    • 2016-09-30
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多