如何将CSV中字符串形式的Decimal列表还原为DataFrame真实列表?
还原CSV中的Decimal列表
方法一:结合ast.literal_eval与自定义解析函数
直接利用ast.literal_eval解析字符串形式的列表,同时传入Decimal命名空间让它识别Decimal类型:
from ast import literal_eval from decimal import Decimal import pandas as pd def parse_decimal_list(s): # 安全解析字符串并还原Decimal列表 return literal_eval(s, {'Decimal': Decimal}) # 读取CSV时指定目标列的转换器 df = pd.read_csv('your_data.csv', converters={'target_column': parse_decimal_list})
说明
ast.literal_eval比原生eval更安全,仅解析合法的Python字面量与容器结构,避免执行恶意代码。- 通过第二个参数传入
{'Decimal': Decimal},让解析器能识别字符串中的Decimal('x')语法,直接还原为Decimal对象。
方法二:正则提取数值后转Decimal
如果字符串格式存在细微变动(如多余空格、符号差异),可以用正则提取所有数值字符串再转换:
import re from decimal import Decimal import pandas as pd def parse_decimal_list(s): # 匹配所有Decimal('数值')格式的内容,提取数值部分 num_matches = re.findall(r"Decimal\('([\d\.]+)'\)", s) return [Decimal(num) for num in num_matches] df = pd.read_csv('your_data.csv', converters={'target_column': parse_decimal_list})
说明
- 正则表达式
r"Decimal\('([\d\.]+)'\)"会精准匹配Decimal('x')或Decimal('x.y')格式的内容,提取其中的数值部分。 - 这种方法对字符串格式的容错性更强,适合处理非标准格式的输入。
可选优化:写入CSV时提前处理
如果可以控制写入环节,建议先将Decimal列表转为字符串列表再写入,后续读取更简便:
# 写入前转换 df['target_column'] = df['target_column'].apply(lambda lst: [str(num) for num in lst]) df.to_csv('your_data.csv', index=False) # 读取时还原 df['target_column'] = df['target_column'].apply(lambda s: [Decimal(num) for num in literal_eval(s)])
内容的提问来源于stack exchange,提问作者Daniil
相关产品推荐
相关产品推荐

