У меня есть функция, которая читает файл с помощью 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
Является ли файл, который вы читаете, закодирован в UTF8?
Есть сообщение, говорящее об этом: UnicodeDecodeError: кодек 'utf-8' не может декодировать байтовый python configparser и продолжать с определенным символом, который он не может декодировать, даже если файл пуст
Да файл сделан в utf8 с функциями configparser
Я обновил сообщение функцией, которая сначала создает файл
Ты заставляешь нас угадывать, в чем на самом деле ошибка. Обновите вопрос, чтобы отобразить полное сообщение об ошибке.
Эта строка: setup = open("data/settings.data", "w")
не указывает писать в utf-8
кодировке.
Проблема в том, что на самом деле у меня больше нет машины с Windows, но я обновлю ее с точной ошибкой как можно скорее.
Я проверю добавление параметра кодирования
Кодировка файлов Windows по умолчанию не utf-8
. Скорее всего, это будет собственная кодовая страница, такая как cp1252
.
@ AnyaShenanigans и Macos по умолчанию используют utf-8?
@ AnyaShenanigans проблема была, как вы сказали, в том, что я должен сохранить в utf8 в предыдущей функции. Если вы сможете напечатать свой ответ, я отмечу его как правильный. Большое спасибо. Я новичок в этой проблеме, и на самом деле я думал, что уже давно решил проблему с кодировкой, разместив utf8 там, где это необходимо, и я решил много ошибок, но я столкнулся с этой проблемой только сейчас, поэтому я был уверен, что сохранение файла было не проблема
В зависимости от платформы, которую вы используете, python по-разному ведет себя в отношении кодирования строковых/двоичных данных. В Linux ваша локаль обычно определяет, в какой кодировке будут обрабатываться данные. Когда вы вошли в систему на рабочем столе, вы можете получить кодировку UTF-8
по умолчанию, но когда вы работаете в среде, такой как cron или в докере, вы получите кодировку ascii
. На Mac это почти всегда UTF-8
. В Windows вы обычно получаете одну из кодовых страниц, например cp1252
.
Короче говоря, каждый раз, когда вы читаете или записываете данные, вам нужно указать кодировку для функции открытия, чтобы гарантировать, что мы обработаем файл должным образом. Если мы забудем кодировку с одной стороны, то нас могут ужалить с другой стороны.
У него даже есть PEP-597, чтобы помочь людям, вводя предупреждение, когда вы забываете использовать кодировку. Если вы передадите свой код через pylint и pyflakes, он также напомнит вам, что вы должны использовать параметр кодирования.
Итак, каждый:
open(filename)
который не является двоичным, почти всегда должен иметь явный параметр encoding=
. Забыть параметр почти всегда является ошибкой.
Что именно вы подразумеваете под "у меня проблемы с кодировкой файла"? Какие проблемы? Есть ли сообщения об ошибках?