如何在DuckDB(Python环境)中读取CSV时强制指定字段为字符串类型?
如何在DuckDB(Python环境)中读取CSV时强制指定字段为字符串类型?
这种字段类型混杂的情况我也碰到过好几次,确实容易让DuckDB的自动类型推断出问题——比如有的ID是整数、有的是字符串,默认的自动检测可能会把整个字段设为整数,导致那些字符串ID读取失败或者被截断。不过有两种简单又靠谱的方法可以解决这个问题:
方法一:用
read_csv的*columns*参数直接指定Schema
这是最直接的方式,在调用duckdb.read_csv()时,通过columns参数明确告诉DuckDB每个字段的类型,强制把ID设为*VARCHAR*(DuckDB的字符串类型)。举个实际的代码例子,假设你的CSV有
id、username、score三个字段:import duckdb # 定义CSV的字段类型,这里强制id为字符串类型 csv_schema = { "id": "VARCHAR", "username": "VARCHAR", "score": "INTEGER" } # 读取CSV并应用指定的Schema,header=True表示CSV第一行是表头 data = duckdb.read_csv("your_data.csv", columns=csv_schema, header=True) # 可以验证一下id字段的类型,确保是字符串 print(duckdb.sql("SELECT typeof(id) FROM data LIMIT 1").fetchone())方法二:先创建表定义Schema,再用
*COPY*导入数据
如果你更习惯用SQL语句来操作数据,也可以先创建一个带有明确Schema的临时表,再把CSV数据导入进去,同样能强制ID字段为字符串。代码示例如下:
import duckdb # 建立DuckDB连接 conn = duckdb.connect() # 先创建表,明确指定id为VARCHAR类型 conn.execute(""" CREATE TABLE user_data ( id VARCHAR, username VARCHAR, score INTEGER ); """) # 从CSV导入数据,HEADER TRUE表示你的CSV文件第一行是表头 conn.execute(""" COPY user_data FROM 'your_data.csv' (HEADER TRUE); """) # 把数据取出到Pandas DataFrame里使用 data_df = conn.execute("SELECT * FROM user_data").df()
两种方法都能完美解决类型不统一的问题,我个人更推荐第一种,代码更简洁直观。要是你的CSV字段特别多,也可以用duckdb.types.VARCHAR来替代字符串"VARCHAR",效果完全一样,看你个人习惯就行。
备注:内容来源于stack exchange,提问作者Vzzarr




