Как правильно записать UTF-8 BOM в файл через Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для сохранения текста в файл в кодировке UTF-8 воспользуйтесь функцией open, установив параметры 'w' и encoding='utf-8':

Python
Скопировать код
with open('file.txt', 'w', encoding='utf-8') as f:
    f.write('Некоторый текст с специальными символами: é, ñ, å')

Указанный выше код сохранит в файл file.txt текст в кодировке UTF-8. Если необходимо пометить порядок байтов меткой BOM, используйте кодировку 'utf-8-sig'.

Кинга Идем в IT: пошаговый план для смены профессии

UTF-8 с BOM: не недруг, а союзник

Для создания файла в UTF-8 с BOM следует использовать кодировку 'utf-8-sig':

Python
Скопировать код
with open('file_with_bom.txt', 'w', encoding='utf-8-sig') as f:
    f.write('Уверенно с BOM в кармане!')  # С юмором и BOM в своем репертуаре! 😉

Кодировка 'utf-8-sig' автоматически добавит метку BOM, без лишних движений.

Зачем останавливаться на основном?

Определение кодировки файла

В Python нет встроенных функций для определения кодировки файла. Однако можно использовать внешние команды:

Python
Скопировать код
import subprocess

result = subprocess.run(['file', '-b', '--mime-encoding', 'file.txt'], stdout=subprocess.PIPE)
encoding = result.stdout.decode('utf-8').strip()
print(f'Кодировка файла: {encoding}, точно как у профи!')

Воспользовавшись модулем subprocess, вы обязательно найдете решение, где бы оно ни скрывалось.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Unicode под маской

Добавить BOM вручную можно следующим образом:

Python
Скопировать код
BOM_UNICODE = u'\ufeff'

Или получить его по имени:

Python
Скопировать код
import unicodedata

BOM_UNICODE = unicodedata.lookup('ZERO WIDTH NO-BREAK SPACE')  # Вот он, настоящий супергерой BOM 🦸

Объявление кодировки скрипта: важное уточнение

В начале Python-скрипта следует указать объявление кодировки для правильной работы с UTF-8:

Python
Скопировать код
# -*- coding: utf-8 -*-

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

Гигиена кодировки

Используя менеджер контекста with, можно не заботиться о закрытии файла. Но если вы открыли файл с помощью codecs.open или file, обязательно используйте close():

Python
Скопировать код
f = codecs.open('file.txt', 'w', 'utf-8')
try:
    f.write('Закрывай за собой двери!')
finally:
    f.close()  # Вежливость – залог хороших отношений с операционной системой 👍

Ваша операционная система отблагодарит вас за освобождение файловых дескрипторов.

Визуализация

Представьте процесс записи в файл как творческий процесс художника:

Палитра (🎨):           Кодировка UTF-8
Холст (📄):              Ваш файл
Шедевр (🖼️):            Текст, который вы в него вносите

Python-код – это инструмент мастера, его кисть:

Python
Скопировать код
with open('masterpiece.txt', 'w', encoding='utf-8') as file:
    file.write('Шедевр в текстовом формате готов покорять мир!')  # Задание выполнено, дайте мне мой берет!

И вот перед вами готовое полотно:

📄: Холст, оживленный духом UTF-8!

Обсуждение нестандартных случаев

Простота превыше всего: UTF-8 без BOM

BOM иногда может усложнить жизнь и вызвать проблемы совместимости. Воспользуйтесь простой кодировкой encoding='utf-8':

Python
Скопировать код
with open('file_no_bom.txt', 'w', encoding='utf-8') as f:
    f.write('Здеь только UTF-8, BOM здесь не причем.')  # Сюда, только без BOM'ов, пожалуйста! 😅

Ошибка UnicodeDecodeError: под контролем

Ошибка UnicodeDecodeError может возникнуть при путанице между байтами и строками. Всегда убеждайтесь, что кодировка входных данных соответствует выходным данным.

Запись экзотических символов: освоение неизведанных глубин

Python использует Unicode, поэтому не опасается необычных символов. Хотите использовать самые экзотические? Воспользуйтесь Unicode escape-последовательностями или именованными символами:

Python
Скопировать код
with open('unicorns.txt', 'w', encoding='utf-8') as f:
    f.write('🦄 можно описать как \U0001F984 или \N{UNICORN FACE}')  # Добавьте еще один мифический символ в свою кодовую коллекцию! 🌈

Полезные материалы

  1. Built-in Functions — Python 3.12.2 documentation — Официальная документация функции Python 3 open().
  2. Unicode HOWTO — Python 3.12.2 documentation — Руководство по работе с UTF-8.
  3. PEP 597 – Add optional EncodingWarning — Планы Python по работе с UTF-8.
  4. codecs — String Encoding and Decoding — PyMOTW 3 — Подробное описание преобразования кодировок.
  5. The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) — Тест на знания об Unicode, который должен пройти каждый разработчик.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой параметр нужно установить при открытии файла для записи в кодировке UTF-8?
1 / 5