迭代json,在文本文件中查找并附加数据(如果不存在)

时间:2019-10-28 19:58:28

标签: python json python-3.x

我有一个不断变化的json文件,有直播的用户/观看者加入和离开。我想将当前正在查看的所有用户以及加入实时流的新用户添加到文本文件中。因此,脚本必须运行并附加新的查看器,直到实时流结束并且查看器列表为空。

我的脚本运行不正常,所以我在做些可怕的错误,为什么我需要您的帮助。 :)

首先,我的while循环无法正常工作。列表为空时不会停止。

第二,它一直保持无限循环运行,不断地重复添加所有内容。因此,无法测试文本文件中是否存在该文本。

希望您能帮助我解决这个问题。我仍然是个新手,所以请像对待需要它的孩子一样对待我:D预先,谢谢您的帮助。

预期的行为:

  • 查看流是否处于活动状态(有观众时),否则为空
  • 迭代json文件。
  • 打开一个文本文件。
  • 测试json中的用户ID是否已存在于文本文件中。
  • 如果尚不存在,请附加用户名和昵称。
  • 如果已经存在,请跳过它们,因为它们已存在于文本文件中。
while data['result']['list'] != '':             # keep it running while list is not empty.
    with open('test.txt', 'a+') as viewers:     # open text file.
        for users in data['result']['list']:    # iterate json.
            for line in viewers:                # iterate text file
                if users['userId'] in line:     # look if userId is already in textfile.
                    break                       # all users has already been added to text file. No new users to add.

                else:                           # append users to file.                   
                    viewers.write(users['nickName'] + '\n')
                    viewers.write(str(users['userId']) + '\n')

json输出看起来像这样,只要观众加入或离开直播流,它就会发生变化:

{
  "code": 1,
  "result": {
    "liveType": 0,
    "watchNum": 140,
    "rank": 0,
    "duringF": 0,
    "list": [
      {
        "userId": 294782,
        "nickName": "user1"
      },
      {
        "userId": 200829,
        "nickName": "user2"
     }
    ],
    "earning": 4183,
    "likeNum": 233
  },
  "msg": "OK"
}

1 个答案:

答案 0 :(得分:0)

此代码有很多问题。

  1. 您正在错误地测试一个空列表。列表不是字符串。
  2. 您不会重新读取JSON文件,因此data从未更改。
  3. 以追加模式打开文件时,您位于文件的末尾,因此尝试读取文件不会读取任何内容。您需要先查找文件的开头。
  4. 您要为每行不匹配的新用户写入文件。您应该等到循环结束,并且仅在从未找到用户的情况下才写。
  5. 当用户ID是该行的子字符串时,
  6. users['userId'] in line将匹配。因此,如果userID为10,则如果101110在行中,则它将匹配。您需要精确匹配该行。
users = set(open("test.txt").read().splitlines()[1::2]) # set of userIds from file
with open("test.txt", "a") as viewers:
    while True:
        with open("json_file.json") as j:
            data = json.load(j)
        for user in data['result']['list']:
            if user['userId'] not in users:
                users.add(user['userId'])
                viewers.write(user['nickName'] + '\n')
                viewers.write(str(user['userId']) + '\n')

对此的一种改进是检查自上一次迭代以来JSON文件的修改时间是否已更改,如果没有,则跳过循环的其余部分。