迭代json,查找文本文件,如果不存在则追加数据

2024-06-01 20:44:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的剧本不符合预期,所以我做错了什么,为什么我需要你的帮助

首先,我的while循环没有按预期工作。当列表为空时,它不会停止

第二,它只是在一个无限循环中运行,不断地附加所有的东西。因此,如果测试已经在文本文件中,那么它将不起作用

我希望你能帮我解决这个问题。我还是一个学习新手,所以把我当成一个需要它的孩子好好解释一下:D提前,谢谢你的帮助

预期行为:

  • 查看流是否处于活动状态(同时存在任何查看器),如果为空,则中断
  • 迭代json文件
  • 打开文本文件
  • 测试json中的用户id是否已经存在于文本文件中
  • 如果尚未出现,请附加userid和昵称
  • 如果已经存在,跳过它们,因为它们已经在文本文件中
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"
}

Tags: 文件totext用户injsonnicknameresult
1条回答
网友
1楼 · 发布于 2024-06-01 20:44:46

这段代码有很多问题

  1. 您测试的空列表不正确。列表不是字符串
  2. 您不会重读JSON文件,因此data不会更改
  3. 在附加模式下打开文件时,您位于文件的末尾,因此尝试读取文件不会读取任何内容。您需要先查找文件的开头
  4. 您正在为每一行不匹配的内容将新用户写入文件。应该等到循环结束,并且只有在找不到用户时才进行写入
  5. users['userId'] in line将在userID是行的子字符串时匹配。因此,如果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文件的修改时间是否自上一次迭代以来发生了变化,如果没有发生变化,则跳过循环的其余部分

相关问题 更多 >