跑微调代码时,有如下报错:
RuntimeError: Caught JSONDecodeError in DataLoader worker process 0.
Original Traceback (most recent call last):
File "/usr/local/lib/python3.8/dist-packages/torch/utils/data/_utils/worker.py", line 302, in _worker_loop
data = fetcher.fetch(index)
File "/usr/local/lib/python3.8/dist-packages/torch/utils/data/_utils/fetch.py", line 58, in fetch
data = [self.dataset[idx] for idx in possibly_batched_index]
File "/usr/local/lib/python3.8/dist-packages/torch/utils/data/_utils/fetch.py", line 58, in <listcomp>
data = [self.dataset[idx] for idx in possibly_batched_index]
File "/root/bbb/Firefly-master/component/dataset.py", line 24, in __getitem__
data = json.loads(data)
File "/usr/lib/python3.8/json/__init__.py", line 357, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.8/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.8/json/decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
看来是之前处理数据时,没处理好。
预期的格式:
{"conversation_id": 1, "category": "Brainstorming", "conversation": ...}
实际的格式:
{'conversation_id': 1, 'category': 'Brainstorming', 'conversation': ...}
用传统搜索引擎搜本文标题,出来的东西不知所云.. 问一下大模型,效果不错... 值得参考..:搬运一下:
问: python写文件 如何让写出来的字典文件是双引号,而不是单引号?
答:要让写出来的字典文件使用双引号而不是单引号,可以使用json模块来实现。
json模块提供了一种简单的方式来将Python对象转换为JSON格式,并且可以控制输出的引号类型。
下面是一个示例代码,展示如何将字典写入文件并使用双引号:
import json
data = {"key1": "value1", "key2": "value2"}
# 打开文件并将字典以JSON格式写入
with open("output.json", "w") as file:
json.dump(data, file, indent=4, ensure_ascii=False)
在上面的代码中,我们使用json.dump()函数将字典data写入文件output.json。indent=4参数用于指定缩进的空格数,ensure_ascii=False参数用于确保输出的文件中包含非ASCII字符。
运行上述代码后,你将得到一个名为output.json的文件,其中的字典使用双引号表示。
问:如果是list内,有多个字典文件呢? 代码是怎样?
答:如果你有一个包含多个字典的列表,并且想将它们写入文件并使用双引号,可以使用相同的方法,只需稍作修改即可。
下面是一个示例代码,展示如何将包含多个字典的列表写入文件并使用双引号:
import json
data = [
{"key1": "value1", "key2": "value2"},
{"key3": "value3", "key4": "value4"},
{"key5": "value5", "key6": "value6"}
]
# 打开文件并将列表以JSON格式写入
with open("output.json", "w") as file:
json.dump(data, file, indent=4, ensure_ascii=False)
在上面的代码中,我们将包含多个字典的列表data写入文件output.json。json.dump()函数会自动将列表中的每个字典转换为JSON格式,并使用双引号表示。
运行上述代码后,你将得到一个名为output.json的文件,其中的列表中的字典使用双引号表示。
问:我要将list内的每一个dict,写在一行内呢?
答:如果你想将列表中的每个字典写在一行内,可以使用json.dumps()函数将字典转换为JSON格式的字符串,然后将字符串写入文件。
下面是一个示例代码,展示如何将包含多个字典的列表写入文件,并将每个字典写在一行内:
import json
data = [
{"key1": "value1", "key2": "value2"},
{"key3": "value3", "key4": "value4"},
{"key5": "value5", "key6": "value6"}
]
# 将列表中的每个字典转换为JSON格式的字符串
json_data = [json.dumps(d, ensure_ascii=False) for d in data]
# 打开文件并将每个字典字符串写入文件的一行
with open("output.json", "w") as file:
file.write('\n'.join(json_data))
在上面的代码中,我们使用列表推导式将列表中的每个字典转换为JSON格式的字符串,并存储在json_data列表中。然后,我们使用'\n'.join(json_data)将每个字典字符串连接为一个字符串,并使用换行符分隔每个字典。最后,我们将该字符串写入文件。
运行上述代码后,你将得到一个名为output.json的文件,其中的每个字典都写在一行内。