#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 или наоборот?