Python - 在JSON数据中找不到密钥,如何解析其他元素?

时间:2017-08-19 13:14:44

标签: python json facebook

我有来自Facebook群组Feed的数据(总共24000条记录)。例如

{
   "data": [
      {
         "message": "MoneyWise its time to vote for the 2017 winners https://www.moneywise.co.uk/home-finances-survey?",
         "updated_time": "2017-07-27T21:15:52+0000",
         "permalink_url": "https://www.facebook.com/groups/uwpartnersforum/permalink/1745120025791166/",
         "from": {
            "name": "John Oliver",
            "id": "10152744793754666"
         },
         "id": "1452979881671850_1745120025791166"
      },
      {
         "message": "We often think of communicating as figuring out a really good message and leaving it that. But the annoying fact is that unless we pay close attention to how that message is landing on the other person, not much communication will take place - Alan Alda",
         "updated_time": "2017-07-27T21:15:26+0000",
         "permalink_url": "https://www.facebook.com/groups/uwpartnersforum/permalink/1744867295816439/",
         "from": {
            "name": "Adrian Watts",
            "id": "10152461880942242"
         },
         "id": "1452979881671850_1744867295816439"
      }
   ]
}

我试图在一个特定的人的帖子中提取,发送命令提示符和文件中的“message”,“permalink_url”,“updated_time”,“name”和“id”(一个内部)奥利弗”。以下python脚本工作..主要是:

fhand = open('try1.json')
urlData = fhand.read()
jsonData = json.loads(urlData)
fout = open('output1.txt', 'w')
for i in jsonData["data"]:
    if i["from"]["name"] == "John Oliver":
        print (i["message"], end = "|")
        print (i["permalink_url"], end = "|")
        print (i["updated_time"], end = "|")
        print (i["from"]["name"], end = "|")
        print (i["from"]["id"], end = "\n")
        print()
        fout.write(str(i["message"]) + "|")
        fout.write(str(i["permalink_url"]) + "|")
        fout.write(str(i["updated_time"]) + "|")
        fout.write(str(i["from"]["name"]) + "|")
        fout.write(str(i["from"]["id"]) + "\n")
fout.close()

但我面临两个问题。 问题1.如果任何记录中没有消息我正在追溯:

Traceback (most recent call last):
  File "facebook_feed.py", line 36, in <module>
    main()
  File "facebook_feed.py", line 25, in main
    print (i["message"], end = "|")
KeyError: 'message'

因此,即使对象没有从中提取所有其他详细信息的消息,我也需要一些帮助来完成整个文件。

问题2.这是一个奇怪的...我有两个文件“try1.json”有500个奇数记录和“trial1.json”有24000个奇数记录,结构完全相同。当我在“Atom”文本编辑器中打开“try1.json”时,它会突出显示颜色smaller file in Atom,但“trial1.json”不会突出显示颜色bigger file in atom。在使用try1.json运行上面的脚本时,我得到了“message”的KeyError(如上所示)但是对于“trial1.json”我得到了这个:

Traceback (most recent call last):
  File "facebook_feed.py", line 36, in <module>
    main()
  File "facebook_feed.py", line 20, in main
    if i["from"]["name"] == "John Oliver":
KeyError: 'from'

trial1.json是17 MB文件..这是一个问题吗?

1 个答案:

答案 0 :(得分:0)

如果您不确定i["message"]是否存在,请不要盲目访问它。使用dict.get,例如i.get('message', 'No message found'),或检查它是否先出现:

if "message" in i:
    print (i["message"], end = "|")

您可以使用i["from"]执行相同类型的操作。

Atom并没有突出显示大文件,因为它很大。但是,如果你能成功json.loads某事,它就是有效的JSON。