我对 python 很陌生,只知道基础知识,所以基本上我正在调用 openai 并获得响应作为回报,并希望将该响应写入 .txt 文件中。
我想在写入文件之前将响应转换为 json 格式。我的回复已经是 json 格式,但打印时很奇怪,它显示 json 格式,并带有
json {}
,这是我的脚本
def get_json(image_file, category):
with open(image_file, "rb") as image:
response = openai_client.chat.completions.create(
model="gpt-4-vision-preview",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": f"Analyze this image and provide the following attributes: color theme, font style, and a short description of about 4-7 words. Categorize it as {category}. Return the result as a JSON object."},
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64.b64encode(image.read()).decode()}"}},
],
}
],
temperature=1,
max_tokens=4095,
top_p=1,
frequency_penalty=0,
presence_penalty=0,
)
return response.choices[0].message.content
with open(file, 'a') as file:
for filename in os.listdir(images_folder):
filepath = os.path.join(images_folder, filename)
result =get_json(filepath, 'hero')
file.write(result + '\n')
json_result = json.loads(result)
print(json_result)
这就是我得到的结果 在此输入图片描述
我想删除文本 '''json'''
尝试通过
json.loads(result)
将其转换为json,但出现以下错误:-
从 None 引发 JSONDecodeError("期望值", s, err.value)
json.decoder.JSONDecodeError:期望值:第1行第1列(字符0)
您要求它在提示中返回一个 JSON 对象,“将结果作为 JSON 对象返回”。这就是为什么!如果您使用网站给出相同的提示,您会注意到响应的格式很好,这是因为那些“````json ...content``”markdown 格式。
可以用两种方法解决:
import json
# For example, this is the content in response:
response = '```json{"color_theme": "Mint Green and Black","font_style": "Sans-serif","short_description": "Web Publishing Platform","category": "hero"}```'
# Replace and assign back to original content
response = response.replace("```json", "")
response = response.replace("```", "")
# Don't forget to convert to JSON as it is a string right now:
json_result = json.loads(response)
import json
# For example, this is the content in response:
response = '```json{"color_theme": "Mint Green and Black","font_style": "Sans-serif","short_description": "Web Publishing Platform","category": "hero"}```'
# "```json" is 7 character long, but slicing count start from 0. "{" is at 7th character.
# "```" is 3 character long (at the end).
response = response[7:-3]
# Don't forget to convert to JSON as it is a string right now:
json_result = json.loads(response)