Python - Как читать разные файлы JSON, но поддерживать один и тот же список - PullRequest
0 голосов
/ 30 ноября 2018

Это может быть сложный вопрос, и я сделаю все возможное, чтобы объяснить как можно лучше!

Я пытаюсь создать сценарий, в котором я запускаю разные файлы json через forloop (каждый из этих файлов json имеетих собственные «данные») - я хочу добавить эти значения в список, где я позже сопоставляю первый объект в json и сопоставляю его, если он найден в сценарии.Если он найден с тем же именем, то мы проверим, является ли его последний объект выше или ниже, чем он был в предыдущем имени этого объекта.Если оно выше, мы печатаем, что оно было выше, и мы меняем объект значения на новый (который мы меняем внутри списка).

Еще одна вещь, которую я хочу сделать, это то, что он должен добавляться в список только один раз, а не n раз, в зависимости от того, сколько файлов json я использую.

Я начинаю с показаjson, который я использую и который, как мы видим, содержит то же имя, но другое число.

    {
        "name": "Albert",
        "image": "https://pbs.twimg.com/profile_images/....jpg",
        "number": "5"
    }
-----------------------------------
    {
        "name": "Albert",
        "image": "https://pbs.twimg.com/profile_images/....jpg",
        "number": "6"
    }

Хорошо, прежде чем я продолжу объяснять.Вот код, который я написал, чтобы я мог объяснить его лучше ...

webhook_list = [
    'https://discordapp.com/api/webhooks/5133124/slack',
    'https://discordapp.com/api/webhooks/5124124/slack',
    'https://discordapp.com/api/webhooks/5112412/slack'] #Discord different API_key/Webhook



def get_identifier(thread):

    thread_id = thread['name'] #Grab name from Json

    try:
        thread_image = thread['image'] #Grab Image from Json
    except KeyError:
        thread_image = None

    try:
        thread_number = thread['numbers'] #Grab Image from Json

    except KeyError:
        thread_number = None

    identifier = ('{}%{}%{}').format(thread_id, thread_image, thread_number) #Make them all into one "String"

    return identifier   


def script():

        old_list = [] #Old_list where we gonna append if new items arrives.
        while True:
            for thread in [line.rstrip('\n') for line in open('names.txt')]: #We check all names in txt file (This can be changed to however you want to print, could be a list aswell. Doesn't matter
                get_value_identifier = get_identifier(thread) #We send the value thread to get_identifier to grab the values which return of the identifier

                if get_identifier(thread) not in old_list: #if this value is not in the old list then we go in here



                    #Slack/Discord function
                    directory = os.fsencode('./slack')
                    for counters, file in enumerate(os.listdir(directory)):
                        filename = os.fsdecode(file)
                        if filename.endswith(".json"):
                            with open('./slack/' + filename) as slackAttachment:
                                data = json.loads(slackAttachment.read())

                                data_list = []

                                # *****************---Picture---*****************
                                try:

                                    data["attachments"][0]["thumb_url"] = information ['image_url'] #We add everything to data so we can later on be able to print it out to discord/slack

                                except Exception:
                                    data["attachments"][0][
                                        "thumb_url"] = 'https://cdn.browshot.com/static/images/not-found.png'

                                # *****************---Footer---*****************

                                data["attachments"][0]["footer"] = str(
                                    data["attachments"][0]["footer"] + ' | ' + datetime.now().strftime(
                                        '%Y-%m-%d [%H:%M:%S.%f')[:-3] + "]")

                                # -------------------------------------------------------------------------

                                a = get_value_identifier.split("%") #We split the identifier meaning it will be name image number
                                for i, items in zip(range(len(old_list)), old_list): #We split the length of old_list length and the old_list (I didn't think out of anything other way than this. This can be changed)
                                    old_list_value = old_list[i].split("%") #We also split the old_list values the same way as we did with *a =...*

                                    if a[0] in old_list_value[0]: #if the first value of both *a* in inside somewhere in a old_list first value.....

                                        if old_list_value[2] < a[2]: #We check if the number is higher than the old_list. If it is then we do the things below

                                            data["attachments"][0]["title"] = information['name'].upper()

                                            data_list.append((webhook_list[counters], data))

                                            for hook, data in data_list:
                                                threading.Thread(target=sendData, args=(hook, data)).start()

                                            old_list[i] = get_value_identifier
                                            break

                                        elif len(old_list_value[2]) >= len(a[2]): #We check if the number is lower than the old_list. If it is then we do the things below

                                            old_list[i] = get_value_identifier
                                            break

                                else: #If nothing is found then we just do things below here and add the value to old_list.

                                    data["attachments"][0]["title"] = information['name'].upper()

                                    data_list.append((webhook_list[counters], data))

                                    for hook, data in data_list:
                                        threading.Thread(target=sendData, args=(hook, data)).start()

                                    old_list.append(get_value_identifier)

            else:
                randomtime = random.randint(3, 7)
                logger.warn('No new item found! - retrying in %d secs' % (randomtime))
                time.sleep(randomtime)

Как видите, это мой код, который я делаю для открытия каждого формата json, и мы используем data = json.loads (slackAttachment.read ()) означает, что он будет складываться в «данные», которые являются json.

directory = os.fsencode('./slack')
for counters, file in enumerate(os.listdir(directory)):
    filename = os.fsdecode(file)
    if filename.endswith(".json"):
      with open('./slack/' + filename) as slackAttachment:
      data = json.loads(slackAttachment.read())

Всякий раз, когда выполняется один из циклов - он складывает все в данные ипозже в конце мы можем распечатать данные или отправить их через запросы в Discord / Slack.

Но в конце, прежде чем я хочу распечатать их, чтобы Discord / Slack - я проверяю прежде всегоесли имя уже есть в списке.Мы делаем это, разделяя каждый%, который будет содержать «Name image Number»

В операторе if мы проверяем, есть ли [0] (который является текущим найденным потоком) - если он находится где-то в старом списке.

  • ЕСЛИ это в старом списке, то мы проверяем последнее число на объекте, если оно выше или ниже

  • ЕСЛИ оно вышемы распечатываем его, так как оно увеличивается, а затем мы меняем предыдущее значение old_list на новое.

  • ЕСЛИ оно ниже, мы просто меняем предыдущее значение old_list на новоеone.

  • ЕСЛИ в старом списке нет ни одного совпадения, мы просто добавляем его в список.

.

 a = get_value_identifier.split("%")
for i, items in zip(range(len(old_list)), old_list):
   old_list_value = old_list[i].split("%")

   if a[0] in old_list_value[0]:

      if old_list_value[2] < a[2]:

        data["attachments"][0]["title"] = information['name'].upper()

        data_list.append((webhook_list[counters], data))

        for hook, data in data_list:
            threading.Thread(target=sendData, args=(hook, data)).start()

        old_list[i] = get_value_identifier
        break

      elif len(old_list_value[2]) > len(a[2]):

         old_list[i] = get_value_identifier
         break

   else:

     data["attachments"][0]["title"] = information['name'].upper()

     data_list.append((webhook_list[counters], data))

     for hook, data in data_list:
        threading.Thread(target=sendData, args=(hook, data)).start()

     old_list.append(get_value_identifier)

и вот механическая проблема.

Проблема, с которой я сталкиваюсь, заключается в том, что в начале, когда мы запускаем

  directory = os.fsencode('./slack')
    for counters, file in enumerate(os.listdir(directory)):
        filename = os.fsdecode(file)
        if filename.endswith(".json"):
          with open('./slack/' + filename) as slackAttachment:
          data = json.loads(slackAttachment.read())

, это то, что она будет циклически проходить через функцию выше

 a = get_value_identifier.split("%")
 for i, items in zip(range(len(old_list)), old_list):
     old_list_value = old_list[i].split("%")......

x раз в зависимости от того, сколько файлов в резерве.Это будет проблемой после второго цикла, потому что в первом цикле будет найден новый элемент.Он добавит его в old_list, используя append, но это означает, что когда второй цикл с slack / discord, это означает, что в old_list, который его содержит, будет значение.И вот с чего начинается продолжение ... То есть первый цикл всегда будет правильным, но после этого он даст вам не правильные ответы.

Мой вопрос в этом случае - два вопроса

  1. Как я могу сделать это всякий раз, когда первый цикл срабатывает и т. Д., Если оператор или elif или еще.Он должен печатать одинаково для всех разногласий / провисаний одновременно.

  2. Если он попадет в оператор if или elif.Внутри тех, что у меня есть, он должен взять значение из old_list [i] и изменить это значение на «более новое», которое является get_value_identifier.Как я могу сделать так, чтобы он делал это только один раз.Потому что я верю, что в моем случае я пробью 3 слабины.Это будет 3 одинаковых значения в old_list из-за цикла for.

Я думаю, что это для меня, и я надеюсь, что объяснил так хорошо, что мог!Пожалуйста.Если есть еще вопрос, который нужно добавить или что-нибудь.Сейчас я буду достаточно активен, и я смогу изменить любой вопрос из-за ваших вопросов ниже!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...