Как я могу добавить и сохранить список в другой файл в Discord Py?

#python #list #discord.py

Вопрос:

Я в основном делаю что-то, что будет принимать контент пользователей, а затем помещать его в список. Я хотел бы сохранить его в другом файле под названием «проблемы», как бы я это сделал? Это мой код для главного бота Discord

 import discord
import random
import problems

TOKEN = "SECRET"

client = discord.Client()

@client.event
async def on_ready():
    print("Bot is ready!")

@client.event
async def on_message(message):
    username = str(message.author).split('#')[0]
    user_message = str(message.content)
    channel = str(message.channel.name)
    print(f"{username}: {user_message} ({channel})")

    if message.author == client.user:
        return
    if message.channel.name == 'test':
        if user_message.lower() == 'hello':
            await message.channel.send(f"Hello {username}!")
            return
        elif user_message.lower() == 'bye':
            await message.channel.send(f"Bye!")
            return
        elif message.content.startswith("!store"):
            a = message.content[6:]
            await message.channel.send("Stored!")
            problemlist = problems.problem.append(a)
            print(problemlist)
    if user_message.lower() == '!code':
        await message.channel.send()
client.run(TOKEN)
 

Вот внутренность моего problems.py

 problem = []
 

В основном пустой список
То, что я получаю, когда он печатает problemlist , — это Нет

Кроме того, я хотел бы, чтобы список сохранялся после перезапуска бота.

Комментарии:

1. Можете ли вы уточнить, хотите ли вы, чтобы переменная в списке problems.py сохранялась (т. Е. вы хотите, чтобы этот список все еще был там, когда вы остановите и перезапустите бота?)

2. @HPringles Да, я бы хотел 🙂

Ответ №1:

В python (и на всех других языках, о которых я знаю), когда вы импортируете другой файл python, он загружает его в виде кода, поэтому, если у problems.py вас все так, как вы указали выше, он выполняется problems = [] каждый раз при запуске сценария, и как только сценарий запускается, это содержимое удаляется из памяти.

Если вы делаете что-то действительно простое, лучшим подходом здесь было бы записать переменную в файл, используя pickle или json . Ниже я привел пример чтения и письма.

 import json

def read(filename):
    """Open the file, read it and parse the json"""
    try:
        with open(filename, 'r') as json_file:
            return json.loads(json_file.read())
    except FileNotFoundError:
        return {}

def write(filename, save_object):
    """Open the file, and write the object as json"""
    with open(filename, 'w') as json_file:
        json_file.write(json.dumps(save_object))

# Get the problems list if it exists.
problems = read('problems.json').get('problems', None) 
# If it doesn't create it.
if problems is None:
    problems = []
problems.append("problem")
write('problems.json', {'problems': problems})
 

Это означало problems.json бы, что файл будет выглядеть примерно так:

 {
    "problems": [ "1", "2", "3", "4"]
}
 

Комментарии:

1. По какой-то причине в нем говорится, что Traceback (most recent call last): File "/home/denzel/Desktop/Bot/Denzelbot/Discordd/code.py", line 15, in <module> problems = read('problems.json').get('problems', None) File "/home/denzel/Desktop/Bot/Denzelbot/Discordd/code.py", line 7, in read with open(filename, 'r') as json_file: FileNotFoundError: [Errno 2] No such file or directory: 'problems.json' я уже создал файл problems.json и вставил туда пустой набор проблем.

2. Мои извинения, я быстро обновлю свой ответ. Если файл еще не был создан, он не сможет прочитать его.

3. Нет, я уже создал один, он все еще говорит то же самое

4. Вполне вероятно, что вы создали файл в месте, которого сценарий не ожидает, попробуйте обновить свой код, чтобы сделать то же самое, что и у меня выше, и это должно исправить ситуацию.

5. Извини, я слишком туп, чтобы заметить, что ты отредактировал код… Спасибо, что теперь это работает! Также хотел бы спросить, есть ли какой-либо вариант использования pickle вместо json или наоборот?