Если myVariable
- это строка, полученная из внешнего источника (например, базы данных), вам сначала нужно выяснить, что это за вид строки.
Так как вам кажется,чтобы использовать python2, есть две основные возможности: myVariable
- это либо Unicode строковый объект, либо байтов строковый объект.Строка Unicode - это строка, которая уже была декодирована в текстовые символы.Строка байтов - это строка, которая уже была закодирована (используется кодировка типа 'utf-8' или 'latin-1').
Из примера кода в вашем вопросе видно, чтоmyVariable
- это байт строковый объект.
Причина, по которой вы получаете первый UnicodeDecodeError
, заключается в том, что вы пытаетесь re -кодировать строку байта.Чтобы сделать это, Python должен сначала декодировать myVariable
к строковому объекту Unicode, прежде чем он сможет применить новую кодировку.По умолчанию python предполагает кодировку "ascii" при автоматическом декодировании таким способом, но поскольку myVariable
содержит байты за пределами диапазона ascii (0-128), возникает ошибка.
Такая же ситуация возникает, когда выпопробуйте передать myVariable
в функцию unicode
.Если не указано явное кодирование, python снова примет «ascii», и вы увидите то же самое UnicodeDecodeError
.
Теперь, когда дело доходит до записи myVariable
в файл, решение очень простоеесли это объект строки байтов: ничего не делать!Просто напишите myVariable
непосредственно в файл:
f = open(path, 'wb')
f.write(myVariable)
f.close()
Однако, когда вы читаете файл обратно, вам потребуется , чтобы узнать исходную кодировку myVariable
, чтобы декодироватьэто в Unicode:
f = open(path)
myVariable = f.read().decode('utf-8')
f.close()
И теперь, если вы измените myVariable
и хотите снова записать его обратно в файл, вы должны помнить, что на этот раз это строка Unicode и вам нужно сначала его кодировать:
f = open(path, 'wb')
f.write(myVariable.encode('utf-8'))
f.close()