masterbo 发表于 2020-10-9 00:48:17

关于json文件处理的问题

正在做一个问答系统的实例,引入一个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-9 00:59:13

不太明白你的意图,如果不是纯小字典,开头有字符,那先转为字符格式,去掉开头,然后再转为字典,不就好了么?

要么你就把一部分数据放出来看看,可以调试下代码

wp231957 发表于 2020-10-9 08:56:23

把文件传上来

masterbo 发表于 2020-10-10 00:17:36

wp231957 发表于 2020-10-9 08:56
把文件传上来

{"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。我想问一下应该怎么做?

masterbo 发表于 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。我想问一下应该怎么做?

疾风怪盗 发表于 2020-10-10 01:23:39

masterbo 发表于 2020-10-10 00:18
{"version": "v2.0", "data": [{"title": "Beyonc%u00e9", "paragraphs": [{"qas": [{"question": "When...

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

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']['paragraphs']['qas']

qlist = for i in q_a_list]
alist = 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}]

bonst 发表于 2020-10-10 09:27:59

你可以给个你希望怎么输出的格式出来看看

masterbo 发表于 2020-10-10 09:45:15

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

谢谢大神。我第一次求助,刚开始学nlp,不知道怎么发数据。您可以讲一下,第27行代码是什么意思吗?我有点没看明白。

疾风怪盗 发表于 2020-10-10 10:12:59

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

你是说26行吧,就是提取数据,逐层提取,就是列表和字典的提取一样

masterbo 发表于 2020-10-10 10:49:34

疾风怪盗 发表于 2020-10-10 10:12
你是说26行吧,就是提取数据,逐层提取,就是列表和字典的提取一样

那【0】代表什么意思呢?

masterbo 发表于 2020-10-10 10:52:58

masterbo 发表于 2020-10-10 10:49
那【0】代表什么意思呢?

我还想问一下就是我发出来的只是一小段,还是列表的形式。我自己对这整个json文件应该怎么做处理呢?

疾风怪盗 发表于 2020-10-10 11:01:20

masterbo 发表于 2020-10-10 10:49
那【0】代表什么意思呢?

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

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

你不清楚层级,就先dumps保存下数据,用pycharm打开,格式化,层次就很清楚了

masterbo 发表于 2020-10-10 11:09:53

疾风怪盗 发表于 2020-10-10 11:01
就是碰到列表的时候,取第一个元素。。。。。。。

我不知道你的场景是什么


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)

疾风怪盗 发表于 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 ...

加个好友

masterbo 发表于 2020-10-10 11:25:16

谢谢大家

masterbo 发表于 2020-10-10 11:26:02

疾风怪盗 发表于 2020-10-10 11:21
加个好友

我积分不够。。。等一下。。。

masterbo 发表于 2020-10-10 11:30:55

疾风怪盗 发表于 2020-10-10 11:21
加个好友

您能帮我解答一下吗?我现在积分不够,加不了好友。

疾风怪盗 发表于 2020-10-10 11:39:42

masterbo 发表于 2020-10-10 11:30
您能帮我解答一下吗?我现在积分不够,加不了好友。

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

加Q381671811

我没试过我也不知道

看你这问题提示,第一个字符就有问题,没看到数据也不清楚
页: [1]
查看完整版本: 关于json文件处理的问题