鱼C论坛

 找回密码
 立即注册
查看: 1741|回复: 17

[已解决]关于json文件处理的问题

[复制链接]
发表于 2020-10-9 00:48:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
正在做一个问答系统的实例,引入一个json文件,里面包括了问题和答案,已经改成了dict格式。然后我想将这个文件里的question和answer分别添加到两个新的列表,因为文件里的每个对应question和answer都在一个小字典里,文件不是纯小字典组成,开头有其他内容。然后想问一下大神们,我应该怎么操作呢?
qList = []
aList = []
d = t_json
for i in t_json:
    qList.append(i['question'])
    aList.append(i['answers'])
print(qList)
print(aList)
这是我的代码,但是报错string indices must be integers
最佳答案
2020-10-10 01:23:39
masterbo 发表于 2020-10-10 00:18
{"version": "v2.0", "data": [{"title": "Beyonc%u00e9", "paragraphs": [{"qas": [{"question": "When  ...

你不能这么给数据啊,给个开头,结尾的括号,都是靠一个一个对出来的。。。。。。。。你可以省略掉中间内容,但是结尾要有啊
import json

# data里面"is_impossible": "false",貌似用逻辑值就报错了,应该都是字符或者数值
data = {"version": "v2.0",
        "data": [{"title": "Beyonc\u00e9",
                  "paragraphs": [{"qas":
                                      [
                                        {"question": "When did Beyonce start becoming popular?",
                                        "id": "56be85543aeaaa14008c9063",
                                        "answers": [{"text": "in the late 1990s", "answer_start": 269}],
                                        "is_impossible": "false"
                                        },
                                       {"question": "What areas did Beyonce compete in when she was growing up?",
                                        "id": "56be85543aeaaa14008c9065",
                                        "answers": [{"text": "singing and dancing", "answer_start": 207}],
                                        }
                                       ]
                                  }]
                  }]
        }
data = str(data).replace('\'', '"')  # 要求全部为双引号
data = json.loads(str(data))  # 抓换为json格式
# 保存json,查看结构
# with open('data1.json','w',encoding='utf-8') as f:
#     f.write(json.dumps(data))
q_a_list = data['data'][0]['paragraphs'][0]['qas']

qlist = [i['question'] for i in q_a_list]
alist = [i['answers'][0] for i in q_a_list]
print(qlist)
print(alist)

['When did Beyonce start becoming popular?', 'What areas did Beyonce compete in when she was growing up?']
[{'text': 'in the late 1990s', 'answer_start': 269}, {'text': 'singing and dancing', 'answer_start': 207}]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-9 00:59:13 | 显示全部楼层
不太明白你的意图,如果不是纯小字典,开头有字符,那先转为字符格式,去掉开头,然后再转为字典,不就好了么?

要么你就把一部分数据放出来看看,可以调试下代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-9 08:56:23 | 显示全部楼层
把文件传上来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-10 00:17:36 | 显示全部楼层

{"version": "v2.0", "data": [{"title": "Beyonc\u00e9", "paragraphs": [{"qas": [{"question": "When did Beyonce start becoming popular?", "id": "56be85543aeaaa14008c9063", "answers": [{"text": "in the late 1990s", "answer_start": 269}], "is_impossible": false}, {"question": "What areas did Beyonce compete in when she was growing up?", "id": "56be85543aeaaa14008c9065", "answers": [{"text": "singing and dancing", "answer_start": 207}]
这是给定文件开头的一部分,后面的内容都是一样的。我现在想做的就是把这个文件里的所有question添加到我的qlist,然后把answer添加到我的alist。我想问一下应该怎么做?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-10 00:18:18 | 显示全部楼层
疾风怪盗 发表于 2020-10-9 00:59
不太明白你的意图,如果不是纯小字典,开头有字符,那先转为字符格式,去掉开头,然后再转为字典,不就好了 ...

{"version": "v2.0", "data": [{"title": "Beyonc\u00e9", "paragraphs": [{"qas": [{"question": "When did Beyonce start becoming popular?", "id": "56be85543aeaaa14008c9063", "answers": [{"text": "in the late 1990s", "answer_start": 269}], "is_impossible": false}, {"question": "What areas did Beyonce compete in when she was growing up?", "id": "56be85543aeaaa14008c9065", "answers": [{"text": "singing and dancing", "answer_start": 207}]
这是给定文件开头的一部分,后面的内容都是一样的。我现在想做的就是把这个文件里的所有question添加到我的qlist,然后把answer添加到我的alist。我想问一下应该怎么做?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 01:23:39 | 显示全部楼层    本楼为最佳答案   
masterbo 发表于 2020-10-10 00:18
{"version": "v2.0", "data": [{"title": "Beyonc%u00e9", "paragraphs": [{"qas": [{"question": "When  ...

你不能这么给数据啊,给个开头,结尾的括号,都是靠一个一个对出来的。。。。。。。。你可以省略掉中间内容,但是结尾要有啊
import json

# data里面"is_impossible": "false",貌似用逻辑值就报错了,应该都是字符或者数值
data = {"version": "v2.0",
        "data": [{"title": "Beyonc\u00e9",
                  "paragraphs": [{"qas":
                                      [
                                        {"question": "When did Beyonce start becoming popular?",
                                        "id": "56be85543aeaaa14008c9063",
                                        "answers": [{"text": "in the late 1990s", "answer_start": 269}],
                                        "is_impossible": "false"
                                        },
                                       {"question": "What areas did Beyonce compete in when she was growing up?",
                                        "id": "56be85543aeaaa14008c9065",
                                        "answers": [{"text": "singing and dancing", "answer_start": 207}],
                                        }
                                       ]
                                  }]
                  }]
        }
data = str(data).replace('\'', '"')  # 要求全部为双引号
data = json.loads(str(data))  # 抓换为json格式
# 保存json,查看结构
# with open('data1.json','w',encoding='utf-8') as f:
#     f.write(json.dumps(data))
q_a_list = data['data'][0]['paragraphs'][0]['qas']

qlist = [i['question'] for i in q_a_list]
alist = [i['answers'][0] for i in q_a_list]
print(qlist)
print(alist)

['When did Beyonce start becoming popular?', 'What areas did Beyonce compete in when she was growing up?']
[{'text': 'in the late 1990s', 'answer_start': 269}, {'text': 'singing and dancing', 'answer_start': 207}]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 09:27:59 From FishC Mobile | 显示全部楼层
你可以给个你希望怎么输出的格式出来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-10 09:45:15 | 显示全部楼层
疾风怪盗 发表于 2020-10-10 01:23
你不能这么给数据啊,给个开头,结尾的括号,都是靠一个一个对出来的。。。。。。。。你可以省略掉中间内 ...

谢谢大神。我第一次求助,刚开始学nlp,不知道怎么发数据。您可以讲一下,第27行代码是什么意思吗?我有点没看明白。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 10:12:59 From FishC Mobile | 显示全部楼层
masterbo 发表于 2020-10-10 09:45
谢谢大神。我第一次求助,刚开始学nlp,不知道怎么发数据。您可以讲一下,第27行代码是什么意思吗?我有 ...

你是说26行吧,就是提取数据,逐层提取,就是列表和字典的提取一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-10 10:49:34 | 显示全部楼层
疾风怪盗 发表于 2020-10-10 10:12
你是说26行吧,就是提取数据,逐层提取,就是列表和字典的提取一样

那【0】代表什么意思呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-10 10:52:58 | 显示全部楼层
masterbo 发表于 2020-10-10 10:49
那【0】代表什么意思呢?

我还想问一下就是我发出来的只是一小段,还是列表的形式。我自己对这整个json文件应该怎么做处理呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 11:01:20 | 显示全部楼层
masterbo 发表于 2020-10-10 10:49
那【0】代表什么意思呢?

[0]就是碰到列表的时候,取第一个元素。。。。。。。

我不知道你的场景是什么
一般我是爬虫时爬数据碰到,那就是像这样先loads数据,如果碰到数据无法转为json,一般是因为格式问题
前面多了点不相关的字符、引号不是双引号之类的,按需处理就好了
然后按照层级一层一层取值,直到想要的数据,
一般这时候的数据是列表里嵌套各个字典的样式,就可以循环获取了

你不清楚层级,就先dumps保存下数据,用pycharm打开,格式化,层次就很清楚了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-10 11:09:53 | 显示全部楼层
疾风怪盗 发表于 2020-10-10 11:01
[0]就是碰到列表的时候,取第一个元素。。。。。。。

我不知道你的场景是什么

with open('train-v2.0.json', 'r', encoding='utf-8') as f:
    data = json.load(f)
    print(data)
我想先打开然后打印这个文件,但是报错了,您能帮我看一下哪里错了吗?
File "C:/Users/lenovo/PycharmProjects/pythonProject3/main.py", line 36, in <module>
    data = json.load(f)
  File "C:\Users\lenovo\AppData\Local\Programs\Python\Python37\lib\json\__init__.py", line 296, in load
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
  File "C:\Users\lenovo\AppData\Local\Programs\Python\Python37\lib\json\__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "C:\Users\lenovo\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\lenovo\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 11:21:21 | 显示全部楼层
masterbo 发表于 2020-10-10 11:09
with open('train-v2.0.json', 'r', encoding='utf-8') as f:
    data = json.load(f)
    print(data ...

加个好友
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-10 11:25:16 | 显示全部楼层
谢谢大家
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-10 11:26:02 | 显示全部楼层

我积分不够。。。等一下。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-10 11:30:55 | 显示全部楼层

您能帮我解答一下吗?我现在积分不够,加不了好友。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 11:39:42 | 显示全部楼层
masterbo 发表于 2020-10-10 11:30
您能帮我解答一下吗?我现在积分不够,加不了好友。

积分不够。。。。。。。。

加Q381671811

我没试过我也不知道

看你这问题提示,第一个字符就有问题,没看到数据也不清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-18 09:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表