如何在DuckDB Python客户端无需转Polars将列名空格替换为下划线?
解决方案
无需转换为Polars DataFrame,结合Python动态生成SQL或直接使用DuckDB关系型API,就能批量将列名中的空格替换为下划线,以下是两种实用实现方式:
方法1:动态生成带别名的SELECT语句
先获取目标表的列名,再构造带别名的查询语句,对含空格的列自动替换命名:
import duckdb # 若已存在目标表可跳过此步:将CSV导入临时表 duckdb.sql("CREATE TEMP TABLE test AS SELECT * FROM 'test.csv'") # 获取表的所有列名 columns = [col[0] for col in duckdb.sql("SELECT column_name FROM information_schema.columns WHERE table_name = 'test'").fetchall()] # 构造SELECT子句:为含空格的列添加下划线命名的别名 select_clause = ", ".join( f"`{col}` AS {col.replace(' ', '_')}" if ' ' in col else col for col in columns ) # 执行查询得到列名替换后的结果 result = duckdb.sql(f"SELECT {select_clause} FROM test") print(result)
输出结果:
┌───────┬──────────────┐ │ id │ company_name │ │ int64 │ varchar │ ├───────┼──────────────┤ │ 1 │ Walmart │ │ 2 │ Amazon │ │ 3 │ Apple │ └───────┴──────────────┘
方法2:直接使用DuckDB关系型API
操作DuckDB原生的Relation对象,通过投影方法批量修改列别名:
import duckdb # 读取CSV获取关系对象 rel = duckdb.sql("SELECT * FROM 'test.csv'") # 遍历列并替换空格为下划线,生成新的关系对象 new_rel = rel.project( ", ".join( f"`{col.name}` AS {col.name.replace(' ', '_')}" if ' ' in col.name else col.name for col in rel.columns ) ) # 查看结果 print(new_rel)
该方法完全基于DuckDB关系型API实现,无需中间格式转换,契合你的需求。
内容的提问来源于stack exchange,提问作者prrao
相关产品推荐
相关产品推荐

