使用Python向DuckDB导入文件因\N空值标识失败
解决DuckDB导入CSV时\N转Null及忽略错误的问题
方案1:通过read_csv_auto参数直接配置空值识别与错误忽略
DuckDB的read_csv_auto支持自定义空值字符串和错误跳过,推荐用原始字符串避免Python的转义解析问题:
con.sql(r""" INSERT INTO getNBBOtimes SELECT * FROM read_csv_auto( 'G:/temp/timeexport.csv', nullstr='\N', ignore_errors=1 ) """)
关键参数说明:
nullstr='\N':告知DuckDB将CSV中的\N识别为Null值,自动适配对应列的数据类型(比如INT64)。ignore_errors=1:开启后会跳过转换失败的行,保证其余正常记录顺利导入。- 原始字符串
r"""":避免Python解析SQL字符串时的转义错误,直接将\N传递给DuckDB处理。
方案2:先导入为VARCHAR再转换处理
如果自动类型识别存在异常,可先将所有列以VARCHAR类型导入,再手动处理空值并转换类型:
con.sql(r""" CREATE TABLE test1 AS SELECT NULLIF(column1, '\N')::INT AS column1, NULLIF(column2, '\N')::INT AS column2, NULLIF(column3, '\N')::INT AS column3, NULLIF(column4, '\N')::INT AS column4 FROM read_csv_auto('G:/temp/timeexport.csv', all_varchar=1) """)
步骤说明:
all_varchar=1:强制所有列以VARCHAR类型导入,绕过初始类型转换失败的问题。NULLIF(columnX, '\N'):将等于\N的字段值转为Null。::INT:将处理后的字段转换为INT类型,可根据实际需求替换为BIGINT、FLOAT等类型。
你之前尝试失败的原因
- 转义错误:使用
'\\\\N'时,Python的unicodeescape解析器会将其判定为无效转义序列,改用原始字符串r'\N'即可解决。 repr函数不存在:DuckDB的SQL语法中没有repr函数,这是Python的内置函数,不能直接在DuckDB语句中使用。
内容的提问来源于stack exchange,提问作者Stumbling Through Data Science
相关产品推荐
相关产品推荐

