Почему эта функция работает в macOS, а не в Windows?

У меня есть функция, которая читает файл с помощью configparser, а в Windows у меня проблемы с кодировкой файла.

Это функция:

def getSetting(name,section):
    cpass = configparser.RawConfigParser()
    cpass.read('data/settings.data', encoding='UTF-8')
    

    value = 'False'

    for each_section in cpass.sections():
        for (each_key, each_val) in cpass.items(each_section):
            if each_section == section and each_key == name:
                value = each_val

    if name == 'log' and value == 'False':
        value = translations['disabilitato_first_cap']
        
    return value

Я пробовал с этим, как сказано в вопросе, который я нашел в самом переполнении стека:

def getSetting(name,section):
    cpass = configparser.RawConfigParser()

    with open('data/settings.data', 'r', encoding='utf-8') as f:
        cpass.read_file(f)

        value = 'False'

        for each_section in cpass.sections():
            for (each_key, each_val) in cpass.items(each_section):
                if each_section == section and each_key == name:
                    value = each_val

        if name == 'log' and value == 'False':
            value = translations['disabilitato_first_cap']
            
    return value

И я также попытался добавить эту строку поверх моих файлов Python:

# -*- coding: utf-8 -*-

Но на самом деле ничего не работает.

Это функция, которая генерирует файл:

def checkSettings(if_false_create):
    cpass = configparser.RawConfigParser()
    try:
        with open('data/settings.data', encoding = "UTF-8") as f:
            cpass.read_file(f)
            return True
    except IOError:
        print(colors.wy+" "+translations['impostazioni_base_configurate'])
        if if_false_create == False:
            return False
        else:
            log = translations['disabilitato_first_cap']
            settings = configparser.RawConfigParser()
            settings.add_section("general_settings")
            settings.set("general_settings", "log", translations['disabilitato_first_cap'])
            settings.set("general_settings", "analyze_account", "doublegram_test_user")
            settings.set("general_settings", "between_autoinvite_pause", "1-3 "+translations['abbreviazione_secondi']+" ("+translations['casuale']+")")
            settings.set("general_settings", "between_invite_pause", "1-3 "+translations['abbreviazione_secondi']+" ("+translations['casuale']+")")
            setup = open("data/settings.data", "w")
            settings.write(setup)

            settings.add_section("adding_settings")
            settings.set("adding_settings", "between_autoinvite_pause", "1-3 "+translations['abbreviazione_secondi']+" ("+translations['casuale']+")")
            settings.set("adding_settings", "auto_add_at_start", translations['abilitato_first_cap'])
            settings.set("adding_settings", "if_account_out", translations['abilitato_first_cap'])
            settings.set("adding_settings", "change_account_n_requests", "20 "+translations['richieste'])
            settings.set("adding_settings", "change_account_pause", "1-5 "+translations['abbreviazione_secondi']+" ("+translations['casuale']+")")
            settings.set("adding_settings", "consecutive_error_breaker", "30 "+translations['errori'])
            settings.set("adding_settings", "start_point_members_file", translations['da_interrotto'])
            settings.set("adding_settings", "add_using", translations['user_id_opt'])
            settings.set("adding_settings", "between_adding_pause", "1-3 "+translations['abbreviazione_secondi']+" ("+translations['casuale']+")")
            settings.set("adding_settings", "casual_pause_times", "3-120 "+translations['abbreviazione_secondi']+" ("+translations['casuale']+")")
            settings.set("adding_settings", "exclude_bot", translations['abilitato_first_cap'])
            settings.set("adding_settings", "exclude_admin", translations['abilitato_first_cap'])
            settings.set("adding_settings", "photo_forcing", translations['abilitato_first_cap'])
            settings.set("adding_settings", "filter_last_seen", translations['nessuna_restrizione'])
            settings.set("adding_settings", "filter_dc", translations['nessuna_restrizione'])
            settings.set("adding_settings", "filter_phone_number", translations['disabilitato_first_cap'])
            settings.set("adding_settings", "stop_max_adding", translations['nessun_limite'])
            settings.set("adding_settings", "continuous_adding", translations['disabilitato_first_cap'])
            settings.set("adding_settings", "ca_ripet", translations['infinito'])
            settings.set("adding_settings", "ca_pause", translations['nessuna_pausa'])
            setup = open("data/settings.data", "w")
            settings.write(setup)
            
            setup.close()
            return log

Что именно вы подразумеваете под "у меня проблемы с кодировкой файла"? Какие проблемы? Есть ли сообщения об ошибках?

ForceBru 09.04.2023 18:44

Является ли файл, который вы читаете, закодирован в UTF8?

jonrsharpe 09.04.2023 18:46

Есть сообщение, говорящее об этом: UnicodeDecodeError: кодек 'utf-8' не может декодировать байтовый python configparser и продолжать с определенным символом, который он не может декодировать, даже если файл пуст

Jack Sparviero 09.04.2023 18:46

Да файл сделан в utf8 с функциями configparser

Jack Sparviero 09.04.2023 18:46

Я обновил сообщение функцией, которая сначала создает файл

Jack Sparviero 09.04.2023 18:48

Ты заставляешь нас угадывать, в чем на самом деле ошибка. Обновите вопрос, чтобы отобразить полное сообщение об ошибке.

John Gordon 09.04.2023 18:49

Эта строка: setup = open("data/settings.data", "w") не указывает писать в utf-8 кодировке.

Anya Shenanigans 09.04.2023 18:50

Проблема в том, что на самом деле у меня больше нет машины с Windows, но я обновлю ее с точной ошибкой как можно скорее.

Jack Sparviero 09.04.2023 18:50

Я проверю добавление параметра кодирования

Jack Sparviero 09.04.2023 18:51

Кодировка файлов Windows по умолчанию не utf-8. Скорее всего, это будет собственная кодовая страница, такая как cp1252.

Anya Shenanigans 09.04.2023 18:54

@ AnyaShenanigans и Macos по умолчанию используют utf-8?

Jack Sparviero 09.04.2023 18:55

@ AnyaShenanigans проблема была, как вы сказали, в том, что я должен сохранить в utf8 в предыдущей функции. Если вы сможете напечатать свой ответ, я отмечу его как правильный. Большое спасибо. Я новичок в этой проблеме, и на самом деле я думал, что уже давно решил проблему с кодировкой, разместив utf8 там, где это необходимо, и я решил много ошибок, но я столкнулся с этой проблемой только сейчас, поэтому я был уверен, что сохранение файла было не проблема

Jack Sparviero 09.04.2023 19:48
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
12
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В зависимости от платформы, которую вы используете, python по-разному ведет себя в отношении кодирования строковых/двоичных данных. В Linux ваша локаль обычно определяет, в какой кодировке будут обрабатываться данные. Когда вы вошли в систему на рабочем столе, вы можете получить кодировку UTF-8 по умолчанию, но когда вы работаете в среде, такой как cron или в докере, вы получите кодировку ascii. На Mac это почти всегда UTF-8. В Windows вы обычно получаете одну из кодовых страниц, например cp1252.

Короче говоря, каждый раз, когда вы читаете или записываете данные, вам нужно указать кодировку для функции открытия, чтобы гарантировать, что мы обработаем файл должным образом. Если мы забудем кодировку с одной стороны, то нас могут ужалить с другой стороны.

У него даже есть PEP-597, чтобы помочь людям, вводя предупреждение, когда вы забываете использовать кодировку. Если вы передадите свой код через pylint и pyflakes, он также напомнит вам, что вы должны использовать параметр кодирования.

Итак, каждый:

open(filename)

который не является двоичным, почти всегда должен иметь явный параметр encoding=. Забыть параметр почти всегда является ошибкой.

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