跑微调代码时,有如下报错:

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的文件,其中的每个字典都写在一行内。