You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python将CSV导入DBeaver时遇空值报错,求代码修改方案

解决CSV含空值的PostgreSQL数据导入问题

问题场景

需要通过Python将region25.csv数据导入DBeaver的cars数据库表,源数据存在空值导致程序报错。使用try-except处理后,数据仅输出到终端,未成功入库。

问题原因

  1. CSV中的空字符串""会被psycopg2作为普通字符串传入,但数据库表字段可能要求接收NULL值,导致插入失败。
  2. 原代码未明确处理空值转换,且错误捕获后仅打印行数据,未输出具体错误信息,无法定位问题。

修改后的代码

import csv
import psycopg2

# 建立数据库连接
conn = psycopg2.connect(
    host="localhost",
    database="cars",
    user="students",
    password="qwerty"
)
cur = conn.cursor()

# 处理CSV空值,将空字符串转为None(psycopg2会自动转为SQL NULL)
def handle_nulls(row):
    return [None if value.strip() == "" else value for value in row]

try:
    with open('region25.csv', 'r', encoding='utf-8') as f:
        reader = csv.reader(f)
        next(reader)  # 跳过表头
        for idx, row in enumerate(reader, start=2):  # 从第2行开始计数(表头是第1行)
            cleaned_row = handle_nulls(row)
            try:
                cur.execute(
                    """INSERT INTO cars (brand, car_name, bodyType, color, fuelType, car_year, mileage, transmission, car_power, price, vehicleConfiguration, engineName, engineDisplacement, car_date, car_location, link, description, parse_date) 
                    VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""",
                    cleaned_row
                )
            except psycopg2.DatabaseError as e:
                print(f"第{idx}行插入失败: {e},数据行: {row}")
                conn.rollback()  # 回滚当前行的错误操作,不影响其他行
            else:
                conn.commit()  # 成功插入则提交当前行
finally:
    # 关闭游标和连接
    cur.close()
    conn.close()

关键修改说明

  • 空值转换:新增handle_nulls函数,将CSV中的空字符串转为None,psycopg2会自动将None映射为SQL的NULL,适配数据库字段的空值要求。
  • 错误定位:捕获错误时打印行号和具体错误信息,方便快速定位问题行。
  • 事务处理:每一行插入成功后立即提交,错误时回滚当前行,避免单个行错误导致整批数据无法入库。
  • 编码处理:打开CSV文件时指定encoding='utf-8',避免中文或特殊字符编码错误。
  • 资源清理:使用finally块确保游标和数据库连接最终关闭,避免资源泄漏。

内容的提问来源于stack exchange,提问作者fryboil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 16:02:48