如何将字符串形式的Polars数据类型转换为原生PolarsDataType以用于read_csv的dtypes参数
如何将字符串形式的Polars数据类型转换为原生PolarsDataType以用于read_csv的dtypes参数
我太懂这种困扰了——从JSON里读出来的类型全是字符串,直接塞给read_csv()的dtypes参数铁定报错,手动一个个改又不现实,毕竟你还有一大堆字段要处理。这里有几个实用的解决方案,帮你批量搞定:
方法一:用getattr()从Polars模块获取原生类型(推荐)
Polars的所有数据类型其实都是pl模块下的属性,比如pl.Int64本质就是polars.Int64。我们可以把字符串里的pl.前缀去掉,再用getattr()从pl模块里取出对应的类型对象:
import polars as pl import json # 读取你的JSON配置文件 with open("your_config.json", "r") as f: config = json.load(f) # 取出字符串形式的类型映射 str_dtypes = config["columns_dtypes_polars"] # 批量转换为原生PolarsDataType native_dtypes = { col: getattr(pl, dtype_str.split(".")[1]) for col, dtype_str in str_dtypes.items() } # 现在就能正常传入read_csv了 df = pl.read_csv("your_data.csv", dtypes=native_dtypes)
这个方法既安全又省心,不用手动维护所有类型的映射,只要字符串格式是pl.XXX就能自动转换,完全没有安全风险,特别适合你字段多的场景。
方法二:用eval()快速转换(谨慎使用)
如果你完全信任JSON配置的来源(比如是自己生成的,没有外部输入),可以用eval()直接执行字符串得到原生类型:
native_dtypes = {col: eval(dtype_str) for col, dtype_str in str_dtypes.items()}
⚠️ 注意:eval()会执行字符串中的任意代码,如果JSON里混入恶意内容,会带来安全隐患,非必要不推荐用这个方法。
方法三:手动创建类型映射字典(最安全)
如果你的类型种类不多,或者想严格控制允许的类型,可以提前创建一个字符串到原生类型的映射表,再批量替换:
type_mapping = { "pl.Utf8": pl.Utf8, "pl.Int64": pl.Int64, "pl.Float64": pl.Float64 } native_dtypes = {col: type_mapping[dtype_str] for col, dtype_str in str_dtypes.items()}
这个方法完全避免了动态执行代码的风险,适合对安全性要求极高的场景,只是需要你把所有用到的类型都提前加到映射表里。
总结下来,优先选第一种getattr()的方法,高效又安全,完美适配你大量字段的需求。
备注:内容来源于stack exchange,提问作者Bish
相关产品推荐
相关产品推荐

