Как можно через python 3 изменить кодировку файла из utf-8 в cp1252 (ос windows 10)?
Как можно через python 3 изменить кодировку файла из utf-8 в cp1252 (ос windows 10)?
- Вопрос задан более трёх лет назад
- 7442 просмотра
Комментировать
Решения вопроса 1
Сергей Горностаев @sergey-gornostaev Куратор тега Python
Седой и строгий
Если файл целиком влезет в память
data = None with open('test.txt', encoding='utf-8') as fh: data = fh.read() with open('test.txt', 'wb') as fh: fh.write(data.encode('cp1251'))
Ответ написан более трёх лет назад
Нравится 1 1 комментарий
Кодировки в python
В python есть 2 объекта работающими с текстом: unicode и str, объект unicode хранит символы в формате (кодировке) unicode, объект str является набором байт/символов в которых python хранит остальные кодировки (utf8, cp1251, cp866, koi8-r и др).
Кодировку unicode можно считать рабочей кодировкой питона т.к. она предназначена для её использования в самом скрипте — для разных операций над строками.
Внешняя кодировка (объект str) предназначена для хранения и передачи текстовой информации вне скрипта, например для сохранения в файл или передачи по сети. Поэтому в данной статье я её назвал внешней. Самой используемой кодировкой в мире является utf8 и число приложений переходящих на эту кодировку растет каждый день, таким образом превращаясь в «стандарт». Эта кодировка хороша тем что для хранения текста она занимает оптимальное кол-во памяти и с помощью её можно закодировать почти все языки мира ( в отличие от cp1251 и подобных однобайтовых кодировок). Поэтому рекомендуется везде использовать utf8, и при написании скриптов.
Использование
Скрипт питона, в самом начале скрипта указываем кодировку файла и сохраняем в ней файл
# coding: utf8
# -*- coding: utf-8 -*-
для того что-бы интерпретатор python понял в какой кодировке файл
Строки в скрипте
Строки в скрипте хранятся байтами, от кавычки до кавычки:
print 'Привет'
= 6 байт при cp1251
= 12 байт при utf8
Если перед строкой добавить символ u, то при запуске скрипта, эта байтовая строка будет декодирована в unicode из кодировки указанной в начале:
# coding:utf8 print u'Привет'
и если кодировка содержимого в файле отличается от указанной, то в строке могут быть «битые символы»
Загрузка и сохранение файла
# coding: utf8 # Загружаем файл с кодировкай utf8 text = open('file.txt','r').read() # Декодируем из utf8 в unicode - из внешней в рабочую text = text.decode('utf8') # Работаем с текстом text += text # Кодируем тест из unicode в utf8 - из рабочей во внешнюю text = text.encode('utf8') # Сохраняем в файл с кодировкий utf8 open('file.txt','w').write(text)
Текст в скрипте
# coding: utf8 a = 'Текст в utf8' b = u'Текст в unicode' # Эквивалентно: b = 'Текст в unicode'.decode('utf8') # т.к. сам скрипт хранится в utf8 print 'a =',type(a),a # декодируем из utf-8 в unicode и далее unicode в cp866 (кодировка консоли winXP ru) print 'a2 =',type(a),a.decode('utf8').encode('cp866') print 'b =',type(b),b
Процедуре print текст желательно передавать в рабочей кодировке либо кодировать в кодировку ОС.
Результат скрипта при запуске из консоли windows XP:
a = type 'str'> ╨в╨╡╨║╤Б╤В ╨▓ utf8 a2 = type 'str'> Текст в utf8 b = type 'unicode'> Текст в unicode
В последней строке print преобразовал unicode в cp866 автоматический, см. следующий пункт
Авто-преобразование кодировки
В некоторых случаях для упрощения разработки python делает преобразование кодировки, пример с методом print можно посмотреть в предыдущем пункте.
В примере ниже, python сам переводит utf8 в unicode — приводит к одной кодировке для того что-бы сложить строки.
# coding: utf8 # Устанавливаем стандартную внешнюю кодировку = utf8 import sys reload(sys) sys.setdefaultencoding('utf8') a = 'Текст в utf8' b = u'Текст в unicode' c = a + b print 'a =',type(a),a print 'b =',type(b),b print 'c =',type(c),c
a = type 'str'> Текст в utf8 b = type 'unicode'> Текст в unicode c = type 'unicode'> Текст в utf8Текст в unicode
Как видим результирующая строка «c» в unicode. Если бы кодировки строк совпадали то авто-перекодирования не произошло бы и результирующая строка содержала кодировку слагаемых строк.
Авто-перекодирование обычно срабатывает когда происходит взаимодействие разных кодировок.
Пример авто-преобразования кодировок в сравнении
# coding: utf8 # Устанавливаем стандартную внешнюю кодировку = utf8 import sys reload(sys) sys.setdefaultencoding('utf8') print '1. utf8 and unicode', 'true' if u'Слово'.encode('utf8') == u'Слово' else 'false' print '2. utf8 and cp1251', 'true' if u'Слово'.encode('utf8') == u'Слово'.encode('cp1251') else 'false' print '3. cp1251 and unicode', 'true' if u'Слово'.encode('cp1251') == u'Слово' else 'false'
1. utf8 and unicode true 2. utf8 and cp1251 false script.py:10: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal print '3. cp1251 and unicode', 'true' if u'Слово'.encode('cp1251') == u'Слово' else 'false' 3. cp1251 and unicode false
В сравнении 1, кодировка utf8 преобразовалась в unicode и сравнение произошло корректно.
В сравнении 2, сравниваются кодировки одного вида — обе внешние, т.к. кодированы они в разных кодировках условие выдало что они не равны.
В сравнении 3, выпало предупреждение из за того что выполняется сравнение кодировок разного вида — рабочая и внешняя, а авто-декодирование не произошло т.к. стандартная внешняя кодировка = utf8, и декодировать строку в кодировке cp1251 методом utf8 питон не смог.
# coding: utf8 d = ['Тест','списка'] print '1',d print '2',d.__repr__() print '3',','.join(d)
1 ['\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82', '\xd1\x81\xd0\xbf\xd0\xb8\xd1\x81\xd0\xba\xd0\xb0'] 2 ['\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82', '\xd1\x81\xd0\xbf\xd0\xb8\xd1\x81\xd0\xba\xd0\xb0'] 3 Тест,списка
При выводе списка, происходит вызов [<repr>]() который возвращает внутреннее представление этого спиcка — print 1 и 2 являются аналогичными. Для корректного вывода списка, его нужно преобразовать в строку — print 3.
Установка внешней кодировки при запуске
PYTHONIOENCODING=utf8 python 1.py
статья будет дополняться.
Как правильно задать кодировку utf-8 в python при генерации файла?
Пробовал написанное уже здесь решение Вывод UTF-8 CGI-скриптом на Python 3, не помогает. Также там пишут, что надо настроить apache. Его можно настроить в openserver или для питона есть свой апач? Версия python 3.7 Итоговый файл
×òî-òî ïðî ãîðîñêîïû ×òî äåíü 2019-10-30ãîòîâèò
Âå÷åðîì îæèäàéòå íåîæèäàííîãî ïðàçäíèêà. Ïîñëå Îáåäà îæèäàéòå âñòðå÷ ñî ñòàðûìè çíàêîìûìè. Ïåðåä Ñíîì îæèäàéòå íåîæèäàííîãî ïðàçäíèêà.
Óòðîì áóäüòå îòêðûòû äëÿ ãîñòåé èç çàáûòîãî ïðîøëîãî. Âå÷åðîì îæèäàéòå âñòðå÷ ñî ñòàðûìè çíàêîìûìè. Âå÷åðîì îæèäàéòå íåîæèäàííîãî ïðàçäíèêà.
Ïîñëå Îáåäà îæèäàéòå ãîñòåé èç çàáûòîãî ïðîøëîãî. Äí¸ì ïðåäîñòåðåãàéòåñü ãîñòåé èç çàáûòîãî ïðîøëîãî. Ïåðåä Ñíîì îæèäàéòå âñòðå÷ ñî ñòàðûìè çíàêîìûìè.
Ïåðåä Ñíîì îæèäàéòå íåîæèäàííîãî ïðàçäíèêà. Óòðîì îæèäàéòå âñòðå÷ ñî ñòàðûìè çíàêîìûìè. Óòðîì ïðåäîñòåðåãàéòåñü ãîñòåé èç çàáûòîãî ïðîøëîãî.
Äí¸ì îæèäàéòå íåîæèäàííîãî ïðàçäíèêà. Ïîñëå Îáåäà áóäüòå îòêðûòû äëÿ ïðèÿòíûõ ïåðåìåí. Óòðîì áóäüòå îòêðûòû äëÿ íåîæèäàííîãî ïðàçäíèêà.
Как указать кодировку utf 8 в python
Быстрое, но не всегда работающее решение
Вначале скрипта надо прописать:
Соответственно, сам текст скрипта должен быть в кодировке UTF-8.
UTF-8 и Python 2.7.x
Но не все так просто. В Python 2.7.x, даже если прописать эту строку в начало файла с исходником, даже если все файлы с исходниками будут в кодировке UTF-8, то не исключена ситуация, что всеравно появится ошибка:
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xd0 in position 0: ordinal not in range(128)
В куче статей, которыми наполнен интернет, почему-то предлагаются частные решения этой глобальной проблемы. Предлагают использовать запись строк с буквой u в начале: u»Это строка» . Другой предлагаемый метод — е сли у вас встречаются строки на русском языке или с кириллическими символами, перекодируйте их в юникод с помощью встроенного в строку метода decode() :
Но такой метод решения проблем — это все равно что вилкой копать скалу. Исковыряете весь код лишними строками, а проблема как была так и останется.
Однако решение все-таки есть
В начале модуля, в котором возникает ошибка, надо прописать:
# Устранение проблем с кодировкой UTF-8
И ошибка кодировки исчезнет.
- Использование UTF-8 в Python, устранение проблем с кодировкой
- Основные конструкции языка Python
- Пример стиля форматирования в Python
- Оператор pass
- Цикл с постусловием в Python
- Как выйти из Python программы с кодом завершения
- Python: пример открытия файла и перебора строк в нём
- Python: работа со строками
- Python: работа со списками
- Python: тип данных bool и операторы сравнения
- Python: запуск внешних программ и команд
- Python: запуск внешней программы или команды
- Работа с директориями и файлами в Python
- Регулярные выражения в Python, простой пример
- Python: выход из программы с кодом возврата
- Python: преобразования типов, определение типа переменной
- Python: списки, кортежи, словари
- Аналог PHP-функции trim() в Python
- Глобальные переменные в языке Python
- Руководство по магическим методам в Питоне
- Как в Python подсчитать количество страниц в PDF-файле
- Основы языка программирования Python за 10 минут
- Импорт скриптов (библиотек) в Python
- Функции с неизвестным числом аргументов в Python и параметры по умолчанию
- Классы в Python для PHP-разработчиков
- Сериализация объектов в Python
- Как в Python получить UNIX Timestamp
- Особенности импорта модулей в Python
- О порядке поиска пакетов и модулей для импорта в Python
- Сводная таблица методов для базовых типов Python2 и Python3
- Наследование в Python — краткое пояснение
- Как в Python вызвать метод того же класса
- Курс «Программирование на Python» от преподавателей СПбАУ РАН и ИТМО
- Бесплатный курс pythontutor.ru (Питонтьютор)
- Краткое описание библиотеки math
- Как установить пакет PIP на компьютере без сети Интернет
- Лямбда-функции в языке Python. Использование map/filter/reduce. Простое объяснение
- Как настроить запуск главного скрипта в Python-проекте в VSCode
- Как в VSCode в проекте на Python обеспечить навигацию по коду
- Как в Python вызвать метод объекта по имени, которое написано в виде строковой переменной?
- 10 ловушек в Python
- 10 хитростей Python, о которых полезно знать
- Django: основы работы
