如何将Ollama的结构化输出转换为Python DataFrame
如何将Ollama的结构化输出转换为Python DataFrame
嘿,我太懂你这种抓耳挠腮的感觉了——Ollama返回的这个格式根本不是标准JSON,而是类Python对象的写法,难怪普通的JSON解析工具都不管用,甚至你手动替换字符都没效果。别慌,给你分享两个靠谱的解决办法,分分钟把它转成DataFrame:
方法一:正则表达式清理格式,转成标准JSON
这个输出里的Pet(...)本质就是键值对集合,咱们只要把它改成JSON认可的格式就行。核心就是把Pet(换成{,把)换成},再把单引号改成双引号(JSON只认双引号),最后包装成合法的JSON数组。
用Python代码实现的话是这样:
import re import pandas as pd import json # 把你的原始Ollama输出粘在这里 raw_text = """pets=[ Pet(name='Luna', animal='cat', age=5, color='grey', favorite_toy='yarn'), Pet(name='Loki', animal='cat', age=2, color='black', favorite_toy='tennis balls') ]""" # 第一步:把列表里的内容提取出来 list_content = re.search(r'\[(.*)\]', raw_text, re.DOTALL).group(1) # 第二步:批量替换格式,改成JSON语法 cleaned = re.sub(r'Pet\s*\(', '{', list_content) # 匹配带任意空格的Pet( cleaned = re.sub(r'\),?', '},', cleaned) # 把)换成},顺便处理末尾逗号 cleaned = cleaned.replace("'", '"') # 单引号转双引号适配JSON规范 # 最后补成完整的JSON数组,去掉末尾多余的逗号 final_json = f"[{cleaned.rstrip(',')}]" # 解析成字典列表再转DataFrame pets_dict = json.loads(final_json) df = pd.DataFrame(pets_dict) print(df)
运行这段代码,你就能得到规整的DataFrame了。
方法二:直接解析Python对象(更省心)
既然这个输出本身就是类Python的结构,咱们不如直接让Python识别它。只要提前定义好Pet这个结构,就能直接把字符串转换成Python列表,再转DataFrame。
代码示例如下:
import pandas as pd from collections import namedtuple # 先定义和输出匹配的Pet结构 Pet = namedtuple('Pet', ['name', 'animal', 'age', 'color', 'favorite_toy']) # 你的原始Ollama输出 raw_text = """pets=[ Pet(name='Luna', animal='cat', age=5, color='grey', favorite_toy='yarn'), Pet(name='Loki', animal='cat', age=2, color='black', favorite_toy='tennis balls') ]""" # 把字符串转换成Python变量 local_namespace = {} exec(raw_text, {'Pet': Pet}, local_namespace) pets_list = local_namespace['pets'] # 一键转DataFrame df = pd.DataFrame(pets_list) print(df)
这个方法不用折腾字符串替换,Python直接就能识别Pet(...)这种写法,只要提前把Pet的结构定义好就行,是不是更省心?
为啥你之前的replace没生效?
你说手动替换括号和Pet没成功,大概率是因为原始文本里有换行、空格这些空白字符!比如Pet(和name之间可能有空格或者换行,普通的str.replace("Pet(", "{")只会匹配完全不带空格的Pet(,自然替换不到。用正则表达式的re.sub就能解决这个问题,它能匹配任意空白字符~
备注:内容来源于stack exchange,提问作者BBJonz
相关产品推荐
相关产品推荐

