Это может быть сложный вопрос, и я сделаю все возможное, чтобы объяснить как можно лучше!
Я пытаюсь создать сценарий, в котором я запускаю разные файлы 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, который его содержит, будет значение.И вот с чего начинается продолжение ... То есть первый цикл всегда будет правильным, но после этого он даст вам не правильные ответы.
Мой вопрос в этом случае - два вопроса
Как я могу сделать это всякий раз, когда первый цикл срабатывает и т. Д., Если оператор или elif или еще.Он должен печатать одинаково для всех разногласий / провисаний одновременно.
Если он попадет в оператор if или elif.Внутри тех, что у меня есть, он должен взять значение из old_list [i] и изменить это значение на «более новое», которое является get_value_identifier.Как я могу сделать так, чтобы он делал это только один раз.Потому что я верю, что в моем случае я пробью 3 слабины.Это будет 3 одинаковых значения в old_list из-за цикла for.
Я думаю, что это для меня, и я надеюсь, что объяснил так хорошо, что мог!Пожалуйста.Если есть еще вопрос, который нужно добавить или что-нибудь.Сейчас я буду достаточно активен, и я смогу изменить любой вопрос из-за ваших вопросов ниже!