Как избежать потери данных при записи в коде телеграм бота?

Почему данные удаляются после 600-ой или 700-ой строки в файле suggested_photos.csv при импорте? Как исправить эту проблему?
  • 19 февраля 2024 г. 12:48
Ответы на вопрос 3
Для избежания потери данных при записи в коде телеграм бота можно использовать резервное копирование данных перед записью, регулярно сохранять данные и проверять их целостность, а также обрабатывать возможные ошибки записи данных.

Потеря данных после 600-ой или 700-ой строки в файле suggested_photos.csv при импорте может быть связана с ограничением на количество строк или объем файла, ошибкой в коде, отсутствием прав доступа или недостаточным объемом памяти. Для исправления этой проблемы можно увеличить лимит на количество строк или объем файла, оптимизировать код для более эффективной записи данных, проверить и исправить возможные ошибки в коде, а также проверить доступ к файлу и наличие достаточного объема памяти.
Читаем доки . 
Синхронный телебот по умолчанию выполняет обработчики в пуле потоков, чтобы один медленный обработчик не ставил колом всего бота. Как следствие, ты ловишь т.н. состояние гонки, когда несколько обработчиков (или несколько копий одного обработчика), работающих в разных потоках, одновременно обращаются к одному ресурсу - например, к твоему словарю suggested_photos, или к файлу, или ещё к чему. Косяки при этом могут возникать самые весёлые - и, что самое неприятное, они будут то появляться, то исчезать в зависимости от порядка исполнения потоков.

Так что либо пробуй отключать многопоточность параметром конструктора Telebot (ссылку на доки я дал), либо разбирайся, как писать многопоточные приложения - например, защищая глобальные ресурсы бота мьютексом.

Также можешь попробовать перейти на асинхронный вариант телебота, но там нужно понимать как вообще устроены асинхронные приложения.
Предлагаю прочитать ошибку: 
import csv

def save_data(photos):
    try:
        with open('suggested_photos.csv', 'a', newline='') as file:
            fieldnames = ['file_id', 'photo_id', 'username', 'user_id', 'editor_id', 'message_id', 'status', 'timestamp']
            writer = csv.DictWriter(file, fieldnames=fieldnames)
            writer.writeheader()

            for file_id, media_data in photos.items():
                writer.writerow({
                    'file_id': file_id,
                    'photo_id': media_data.get('photo_id', ''),
                    'username': media_data.get('username', ''),
                    'user_id': media_data.get('user_id', ''),
                    'editor_id': media_data.get('editor_id', ''),
                    'message_id': media_data.get('message_id', ''),
                    'status': media_data.get('status', ''),
                    'timestamp': media_data.get('timestamp', ''),
                })

    except Exception as e:
        print("Error saving data:", e)
Похожие вопросы