Сериализация переменных в Python

Пишу бота для Discord, задача бота ставить лимит цены на стоки и при достижении сигнализировать. Есть две переменных: stock и price. Каждое отправленное сообщение в Discord присваивается к этим переменных. К примеру AAPL 127, где aapl это stock, а 127-price. Бот умеет следить за несколькими стоками сразу, но при перезагрузки скрипта или при пропадании интернет соединения все присвоенные значение сбрасываются. Вопрос есть ли способ все эти переменные сохранить в файле и при загрузке скрипта он их считывал с файла, и была возможность добавлять и удалять значение в этом файле. Знаю что для таких случаев есть pickle, но не как не смог это реализовать, может есть другие способы?

import pickle
import discord
from discord.ext import commands
from config import settings
import aiohttp
from bs4 import BeautifulSoup


bot=commands.Bot(command_prefix = settings['prefix'], help_command=None)

@bot.event
async def on_ready():
    bot.session = aiohttp.ClientSession()
    print('Logged in as')
    print(bot.user.name)
    print(bot.user.id)
    print('Bot is ready')
    print('--------------------')

@bot.event
async def on_message(message):
    await bot.process_commands(message)
    channel = message.channel
    co = '{0.content}'.format(message).split()
    stock=co[0]
    price=float(co[1])
    print(stock)
    print(price)

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0'
    }
    while True:
        async with bot.session.get(
                f'https://finance.yahoo.com/quote/{stock}?p={stock}.tsrc=fin-srch',
                headers=headers
        ) as r:
            def scrape(html):
                soup = BeautifulSoup(html, 'lxml')
                content = soup.find('div', {"class": 'My(6px) Pos(r) smartphone_Mt(6px)'}).find('span').text
                return content
            content = await bot.loop.run_in_executor(None, scrape, await r.text())
            con=float(content)
            if price <= con:
                await channel.send("достиг")
                break
        print(f'{stock} {content}')




bot.run(settings['token'])
 

Ответы (1 шт):

Автор решения: Georgiy

Правильный способ: подключить базу данных и туда сохранять. Судя по коду это личный проект и он будет на одном сервере работать и sqlite3 должно хватить вполне (для продакта такой код не годится можно словить лимит на API, но не в этом суть вопроса)

Простой способ уровня "и так сойдет": создать json файл и туда сохранять, структура файла будет выглядеть примерно так:

{
"stock": 0,
"price": 0
}

Работа с json в python

→ Ссылка