Python write encoding windows 1251

Функции encode() и decode() в Python

Методы encode и decode Python используются для кодирования и декодирования входной строки с использованием заданной кодировки. Давайте подробно рассмотрим эти две функции.

encode заданной строки

Мы используем метод encode() для входной строки, который есть у каждого строкового объекта.

Это кодирует input_string с использованием encoding , где errors определяют поведение, которому надо следовать, если по какой-либо случайности кодирование строки не выполняется.

encode() приведет к последовательности bytes .

Как и ожидалось, в результате получается объект :

Тип кодирования, которому надо следовать, отображается параметром encoding . Существуют различные типы схем кодирования символов, из которых в Python по умолчанию используется схема UTF-8.

Рассмотрим параметр encoding на примере.

Как вы можете заметить, мы закодировали входную строку в формате UTF-8. Хотя особой разницы нет, вы можете заметить, что строка имеет префикс b . Это означает, что строка преобразуется в поток байтов.

На самом деле это представляется только как исходная строка для удобства чтения с префиксом b , чтобы обозначить, что это не строка, а последовательность байтов.

Обработка ошибок

Существуют различные типы errors , некоторые из которых указаны ниже:

Тип ошибки Поведение
strict Поведение по умолчанию, которое вызывает UnicodeDecodeError при сбое.
ignore Игнорирует некодируемый Unicode из результата.
replace Заменяет все некодируемые символы Юникода вопросительным знаком (?)
backslashreplace Вставляет escape-последовательность обратной косой черты (\ uNNNN) вместо некодируемых символов Юникода.

Давайте посмотрим на приведенные выше концепции на простом примере. Мы рассмотрим входную строку, в которой не все символы кодируются (например, ö ),

Декодирование потока байтов

Подобно кодированию строки, мы можем декодировать поток байтов в строковый объект, используя функцию decode() .

Поскольку encode() преобразует строку в байты, decode() просто делает обратное.

Это показывает, что decode() преобразует байты в строку Python.

Подобно параметрам encode() , параметр decoding определяет тип кодирования, из которого декодируется последовательность байтов. Параметр errors обозначает поведение в случае сбоя декодирования, который имеет те же значения, что и у encode() .

Важность кодировки

Поскольку кодирование и декодирование входной строки зависит от формата, мы должны быть осторожны при этих операциях. Если мы используем неправильный формат, это приведет к неправильному выводу и может вызвать ошибки.

Первое декодирование неверно, так как оно пытается декодировать входную строку, которая закодирована в формате UTF-8. Второй правильный, поскольку форматы кодирования и декодирования совпадают.

Кодировки в python

прочтение статьи занимает 4мин, с обдумыванием — 10мин 🙂
примечание: данная статья относится к python 2.x, но для python 3.x принцип тот же

Читайте также:  Установка файла подкачки windows 10

Общее

В python есть 2 объекта работающими с текстом: unicode и str, объект unicode хранит символы в формате (кодировке) unicode, объект str является набором байт/символов в которых python хранит остальные кодировки (utf8, cp1251, cp866, koi8-r и др).

Кодировку unicode можно считать рабочей кодировкой питона т.к. она предназначена для её использования в самом скрипте — для разных операций над строками.
Внешняя кодировка (объект str) предназначена для хранения и передачи текстовой информации вне скрипта, например для сохранения в файл или передачи по сети. Поэтому в данной статье я её назвал внешней. Самой используемой кодировкой в мире является utf8 и число приложений переходящих на эту кодировку растет каждый день, таким образом превращаясь в «стандарт». Эта кодировка хороша тем что для хранения текста она занимает оптимальное кол-во памяти и с помощью её можно закодировать почти все языки мира ( в отличие от cp1251 и подобных однобайтовых кодировок). Поэтому рекомендуется везде использовать utf8, и при написании скриптов.

Использование

для того что-бы интерпретатор python понял в какой кодировке файл

Строки в скрипте
Строки в скрипте хранятся байтами, от кавычки до кавычки:

= 6 байт при cp1251
= 12 байт при utf8

Если перед строкой добавить символ u, то при запуске скрипта, эта байтовая строка будет декодирована в unicode из кодировки указанной в начале:

и если кодировка содержимого в файле отличается от указанной, то в строке могут быть «битые символы»

Загрузка и сохранение файла

В последней строке print преобразовал unicode в cp866 автоматический, см. следующий пункт

Авто-преобразование кодировки
В некоторых случаях для упрощения разработки python делает преобразование кодировки, пример с методом print можно посмотреть в предыдущем пункте.
В примере ниже, python сам переводит utf8 в unicode — приводит к одной кодировке для того что-бы сложить строки.

Как видим результирующая строка «c» в unicode. Если бы кодировки строк совпадали то авто-перекодирования не произошло бы и результирующая строка содержала кодировку слагаемых строк.
Авто-перекодирование обычно срабатывает когда происходит взаимодействие разных кодировок.

Пример авто-преобразования кодировок в сравнении

В сравнении 1, кодировка utf8 преобразовалась в unicode и сравнение произошло корректно.
В сравнении 2, сравниваются кодировки одного вида — обе внешние, т.к. кодированы они в разных кодировках условие выдало что они не равны.
В сравнении 3, выпало предупреждение из за того что выполняется сравнение кодировок разного вида — рабочая и внешняя, а авто-декодирование не произошло т.к. стандартная внешняя кодировка = utf8, и декодировать строку в кодировке cp1251 методом utf8 питон не смог.

Читайте также:  Подключение принтера kyocera linux

При выводе списка, происходит вызов [<repr>]() который возвращает внутреннее представление этого спиcка — print 1 и 2 являются аналогичными. Для корректного вывода списка, его нужно преобразовать в строку — print 3.

Установка внешней кодировки при запуске

статья будет дополняться.

Как прочитать файл в кодировке cp1251?

Как правильно вывести файл в кодировке UTF-16LE?
Друзья! НА самом-то деле я всё правильно делаю. Вот код: import codecs f = codecs.open.

Как прочитать файл?
Всем привет! Я новичок в Python. ————————————— Мне нужно что бы эта.

Считать файл, заменить текст, сохранить файл в новой кодировке
Доброго времени суток уважаемые! Никак не могу справиться с элементарной казалось бы задачей.

Запись в файл в нужной кодировке
Доброго дня! Получаю веб-страницу через сокет, отображаю в среде — html отлично читается.

У меня все нормально. Ты с консолью виндовой работаешь? Я просто пробовал в IDLE.

Если в консоли, то тебе нужно преобразовать в данные в кодировку cp688.

С консолью Pycharm. Ну он наверное виндовую использует.

Добавлено через 3 минуты

С консолью Pycharm. Ну он наверное виндовую использует.

Добавлено через 3 минуты

спасибо, что поправил
ошибся

Добавлено через 3 минуты
DarthLenin, попробуй ещё раз с учётом изменившейся информации

кодировка — это именованный аргумент

всё правильно выдаёт, там ожидается тип буферизации

Тематические курсы и обучение профессиям онлайн
Профессия Python-разработчик (Skillbox)
Профессия Fullstack-разработчик на Python (Skillbox)
Python-разработчик с нуля (Нетология)
Fullstack-разработчик на Python (Нетология)

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Прочитать файл в кодировке cp1251 и перевести в кодировки koi8r, iso88595, unicode, microsoft sp866
работа с кодовыми таблицами русского языка дан исходный текст , кодировка cp-1251 составить.

Как прочитать файл в DOS-кодировке ?
У меня есть файл в DOS-кодировке. Как мне считать оттуда строку, чтобы она нормально отображалась.

Как можно прочитать файл текстовый в кодировке UTF-8?
Как можно прочитать файл текстовый в кодировке UTF-8?(при чтении c помощью FileSystemObject вместо.

Как прочитать текстовый файл в кодировке Win1251 (VS2005)?
Проект: textbox и две кнопки для вывода текста в разных кодировках. Вывожу текст в textbox1 Unicod.

How to convert a string from cp1251 to UTF-8 in Python3?

A help needed with a pretty simple Python 3.6 script.

First, it downloads an HTML file from an old-fashioned server which uses cp1251 encoding.

Then I need to put the file contents into a UTF-8 encoded string.

Here is what I’m doing:

Here is the error:

I’d really appreciate any help with it.

4 Answers 4

Not sure what you are trying to do.

.text is the text of the response, a Python string. Encodings don’t play any role in Python strings.

Читайте также:  Монкрус windows 10 ltsc

Encodings only play a role when you have a stream of bytes that you want to convert to a string (or the other way around). And the requests module already does that for you.

For example, assume you have a text file (i.e.: bytes). Then you must pick an encoding when you open() the file — the choice of encoding determines how the bytes in the file are converted into characters. This manual step is necessary because open() cannot know what encoding the bytes of the file are in.

HTTP on the other hand sends this in the response headers ( Content-Type ), so requests can know this information. Being a high-level module, it helpfully looks at the HTTP headers and converts the incoming bytes for you. (If you would use the much more low-level urllib , you’d have to do your own decoding.)

The .encoding property is purely informational when you use the .text of the response. It might be relevant if you use the .raw property, though. For work with servers that return regular text responses, using .raw is seldom necessary.

Как записать текст на русском в файл UTF-8?

1. Почему файлы ‘str_ru_text_1.txt’, ‘str_ru_text_2.txt’ в кодировке Windows 1251, а файлы ‘str_en_text_1.txt’, ‘str_en_text_2.txt’ — в UTF-8?

2. Есть ли способ записать utf-8 без str.encode(‘utf-8’)?

3. Где описаны правила записи строк в файл? Где и что почитать по этой проблеме?

Python 3.4, Windows 8.1

  • Вопрос задан более трёх лет назад
  • 26816 просмотров

Товарищи, это писец какой-то. Хотели как лучше, а получилось еще более через жопу.

mode is an optional string that specifies the mode in which the file is opened. In text mode, if encoding is not specified the encoding used is platform dependent: locale.getpreferredencoding(False) is called to get the current locale encoding. (For reading and writing raw bytes use binary mode and leave encoding unspecified.)

1. Если не указан режим ‘b’, то по умолчанию файл считается текстовым. В двоичный файл можно писать только байты, в текстовый — только юникод.
(В текстовом режиме файл читается только до EOF (‘\x1a’). Как совместить чтение до конца файла и запись юникода в файл? А никак.)
2. Если кодировка не указана, по умолчанию берется locale.getpreferredencoding(False), т.е. результат выполнения будет зависеть от настроек оси! (для винды — от текущей локали). Нахера. От одних граблей избавились, другие приобрели.

В общем, всегда явно указывай явно кодировку файла.

Оцените статью