Сохранение файла python + json

Проблема заключается в сохранении данных в файлах json, скажем, они сохраняются так:

{"discordid1": {"username": "discorduser1", "roblox_username": "robloxuser1"}, "discordid2": {"username": "discorduser2", "roblox_username": "robloxuser2"}, "discordid3": { "username": "discorduser3", "roblox_username": "robloxuser3"}} вот что он видит сейчас, когда я выполняю команду, и через некоторое время (несколько часов) он показывает только 2 пользователей и указывает на то, что 1 отсутствующий пользователь исчезает (еще один файл json)

COOLDOWNS_FILE = 'cooldowns.json'
SECOND_COOLDOWNS_FILE = 'second_cooldowns.json'
USER_LOGS_FILE = "user_logs.json"
USER_REGISTRATION_FILE = "user_registration.json"

def load_json_file(file_path):
    try:
        with open(file_path, 'r') as f:
            return json.load(f)
    except FileNotFoundError:
        return {}
    except json.JSONDecodeError:
        print(f"Error loading {file_path}: file is empty or invalid JSON")
        return {}

def save_json_file(data, file_path):
    with open(file_path, "w") as f:
        json.dump(data, f, indent=4)

def load_cooldowns(file_path):
    if not os.path.exists(file_path):
        return {}
    try:
        with open(file_path, "r") as f:
            data = json.load(f)
        data_to_return = {}
        for user_id, cooldown_time in data.items():
            data_to_return[user_id] = dt.datetime.fromisoformat(cooldown_time.replace("Z", "+00:00"))
        return data_to_return
    except json.JSONDecodeError:
        return {}

def save_cooldowns(cooldowns):
    data_to_save = {}
    for user_id, cooldown_time in cooldowns.items():
        data_to_save[user_id] = cooldown_time.isoformat()
    with open("cooldowns.json", "w") as f:
        json.dump(data_to_save, f, indent=4)

def load_second_cooldowns():
    if not os.path.exists(SECOND_COOLDOWNS_FILE):
        return {}
    try:
        with open(SECOND_COOLDOWNS_FILE, "r") as f:
            data = json.load(f)
        data_to_return = {}
        for user_id, cooldown_time in data.items():
            data_to_return[user_id] = dt.datetime.fromisoformat(cooldown_time)
        return data_to_return
    except json.JSONDecodeError:
        return {}

def save_second_cooldowns(second_cooldowns):
    data_to_save = {}
    for user_id, cooldown_time in second_cooldowns.items():
        data_to_save[user_id] = cooldown_time.isoformat()
    with open(SECOND_COOLDOWNS_FILE, "w") as f:
        json.dump(data_to_save, f, indent=4)

cooldowns = load_cooldowns(COOLDOWNS_FILE)
second_cooldowns = load_second_cooldowns()

и вот как он сохраняет файлы

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот что мы можем сделать, чтобы решить проблему:

Сначала сохраните данные во временный файл, а затем переименуйте его. Таким образом, вы не потеряете данные, если во время записи что-то пойдет не так. Если ваша программа использует несколько потоков, убедитесь, что они не взаимодействуют с файлами одновременно. Выявляйте и обрабатывайте ошибки более корректно, чтобы избежать потери данных.

Улучшенный код должен выглядеть примерно так:

import json
import os
import datetime as dt
import threading

# File paths
COOLDOWNS_FILE = 'cooldowns.json'
SECOND_COOLDOWNS_FILE = 'second_cooldowns.json'
USER_LOGS_FILE = "user_logs.json"
USER_REGISTRATION_FILE = "user_registration.json"

# Lock for safety when using threads
lock = threading.Lock()

def load_json_file(file_path):
    """Load data from a JSON file."""
    with lock:
        try:
            if not os.path.exists(file_path):
                return {}
            with open(file_path, 'r') as f:
                return json.load(f)
        except (FileNotFoundError, json.JSONDecodeError):
            return {}

def save_json_file(data, file_path):
    """Save data to a JSON file safely."""
    with lock:
        temp_file_path = file_path + '.tmp'
        with open(temp_file_path, "w") as f:
            json.dump(data, f, indent=4)
        os.replace(temp_file_path, file_path)

def load_cooldowns(file_path):
    """Load cooldown times from a JSON file."""
    data = load_json_file(file_path)
    data_to_return = {}
    for user_id, cooldown_time in data.items():
        data_to_return[user_id] = dt.datetime.fromisoformat(cooldown_time.replace("Z", "+00:00"))
    return data_to_return

def save_cooldowns(cooldowns):
    """Save cooldown times to a JSON file."""
    data_to_save = {user_id: cooldown_time.isoformat() for user_id, cooldown_time in cooldowns.items()}
    save_json_file(data_to_save, COOLDOWNS_FILE)

def load_second_cooldowns():
    """Load second cooldown times from a JSON file."""
    data = load_json_file(SECOND_COOLDOWNS_FILE)
    data_to_return = {}
    for user_id, cooldown_time in data.items():
        data_to_return[user_id] = dt.datetime.fromisoformat(cooldown_time)
    return data_to_return

def save_second_cooldowns(second_cooldowns):
    """Save second cooldown times to a JSON file."""
    data_to_save = {user_id: cooldown_time.isoformat() for user_id, cooldown_time in second_cooldowns.items()}
    save_json_file(data_to_save, SECOND_COOLDOWNS_FILE)

# Load initial data
cooldowns = load_cooldowns(COOLDOWNS_FILE)
second_cooldowns = load_second_cooldowns()

Другие вопросы по теме