You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在DuckDB(Python环境)中读取CSV时强制指定字段为字符串类型?

如何在DuckDB(Python环境)中读取CSV时强制指定字段为字符串类型?

这种字段类型混杂的情况我也碰到过好几次,确实容易让DuckDB的自动类型推断出问题——比如有的ID是整数、有的是字符串,默认的自动检测可能会把整个字段设为整数,导致那些字符串ID读取失败或者被截断。不过有两种简单又靠谱的方法可以解决这个问题:

  • 方法一:用read_csv*columns*参数直接指定Schema
    这是最直接的方式,在调用duckdb.read_csv()时,通过columns参数明确告诉DuckDB每个字段的类型,强制把ID设为*VARCHAR*(DuckDB的字符串类型)。

    举个实际的代码例子,假设你的CSV有idusernamescore三个字段:

    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

火山引擎 最新活动