Нежелательный результат в выходном файле при многократном вызове функции - PullRequest
1 голос
/ 04 мая 2020
Контекст:

Я создаю программу, которая автоматически заменяет значки приложений MacOS, и в настоящее время я делаю функцию резервного копирования некоторой информации перед заменой этих значков.

Проблема:

Когда я вызываю следующую функцию один раз все работает отлично, но когда я вызываю его во второй раз, к файлу добавляется та же информация, даже если я предоставил оператор if.
Я не могу заставить функцию «прочитать файл, а если нет» существует создать файл, затем прочитать его "а также" добавить к файлу, если app["app_name"] нет в файле ".

код:
def backup(app_list):
    """ 
    Takes a list of dictionaries containing the "name" & "path" of each application
    Saves the original icon name for each application in a file
    """
    if not os.path.exists(BACKUP_PATH):
        os.mkdir(BACKUP_PATH)
    for app in get_icon_name(app_list):
        with open(os.path.join(BACKUP_PATH, "CFBundleIconFile.txt"), "a+") as file:
            if app["app_name"] not in file.read():
                file.write(str(app) + "\n")
уточнение:

Функция «get_icon_name» возвращает список словарей, содержащих «app_name» и «icon_name» для каждого приложения в данном списке.

1 Ответ

0 голосов
/ 04 мая 2020

Мне удалось решить проблему с помощью метода seek().
Использование file.seek(0) сразу после открытия файла в a+ помещает указатель файла в начало файла, что позволяет мне «прочитайте файл, и если он не существует, создайте файл, а затем прочитайте его».
Чтобы «добавить файл, если утверждение истинно», я добавил file.seek(0, 2) после оператора if app["app_name"] not in file.read(), который помещает снова указатель файла в конец файла.

код:
def backup(app_list):
    """ 
    Takes a list of dictionaries containing the "name" & "path" of each application
    Saves the original icon name for each application in a file
    """
    if not os.path.exists(BACKUP_PATH):
        os.mkdir(BACKUP_PATH)
    for app in get_icon_name(app_list):
        with open(os.path.join(BACKUP_PATH, "CFBundleIconFile.txt"), "a+") as file:
            file.seek(0)
            if app["app_name"] not in file.read():
                file.seek(0, 2)
                file.write(str(app) + "\n")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...