чтение результатов в пустой файл config.txt в python - PullRequest
0 голосов
/ 08 мая 2020
# read no. of requests
if(os.path.isfile("config.txt")):
        with open("config.txt", "r") as json_file:# Open the file for reading   
            configurations = json.load(json_file) # Read the into the buffer
            # info = json.loads(js.decode("utf-8"))
            print("read config file")
            if("http_requests_count" in configurations.keys()):
                print("present")
                print(configurations["http_requests_count"])
                number_of_requests = int(configurations["http_requests_count"])
                print(number_of_requests)

файл config.txt, из которого я читаю

{
    "first_container_ip": "8100",
    "master_db" : "abc",
    "http_requests_count" : "8",
    "master_name" : "master",
    "slave_names" : ["slave1", "slave2", "slave3"]
}

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

io.UnsupportedOperation: not readable

и когда я открываю файл конфигурации вручную, я обнаруживаю, что он пуст ...

1 Ответ

1 голос
/ 08 мая 2020

В вашем примере полного кода вы выполняете

with open("config.txt", "w") as json_file:# Open the file for writing
    configurations = json.load(json_file) # Read the into the buffer

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

Вот почему вы получаете ошибку UnsupportedOperation и почему файл оказывается пустым.

Я предлагаю провести рефакторинг, чтобы у вас было два простых функции для чтения и записи файла конфигурации:

def read_config():
    if os.path.isfile("config.txt"):
        with open("config.txt", "r") as json_file:
            return json.load(json_file)
    return {}


def save_config(config):
    with open("config.txt", "w") as json_file:
        json.dump(config, json_file)


def scaleup(diff):
    config = read_config()
    slave_name_list = config.get("slave_names", [])
    # ... modify things ...
    config["slave_names"] = some_new_slave_name_list
    save_config(config)


def scaledown(diff):
    config = read_config()
    slave_name_list = config.get("slave_names", [])
    # ... modify things...
    slave_name_list = list(set(slave_name_list) - set(slave_list))
    config["slave_names"] = slave_name_list
    save_config(config)

(В стороне, поскольку вы выполняете Docker управление контейнерами, рассмотрите возможность использования самих ярлыков контейнеров в качестве основных данных для вашего управления состоянием вместо отдельный файл, который легко может go рассинхронизировать c.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...