使用Python将CSV导入DBeaver时遇空值报错,求代码修改方案
解决CSV含空值的PostgreSQL数据导入问题
问题场景
需要通过Python将region25.csv数据导入DBeaver的cars数据库表,源数据存在空值导致程序报错。使用try-except处理后,数据仅输出到终端,未成功入库。
问题原因
- CSV中的空字符串
""会被psycopg2作为普通字符串传入,但数据库表字段可能要求接收NULL值,导致插入失败。 - 原代码未明确处理空值转换,且错误捕获后仅打印行数据,未输出具体错误信息,无法定位问题。
修改后的代码
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
相关产品推荐
相关产品推荐

