Работа с Unicode (UTF-8) в Python: чтение и запись в файл

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

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

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

Работа с UTF-8 в Python не вызывает проблем: достаточно использовать функцию open и указать параметр encoding='utf-8':

Чтение файла:

Python
Скопировать код
# Открываем текст, полный идей
with open('file.txt', encoding='utf-8') as f:
    text = f.read()  # Вот так, знания у нас в кармане!

Запись в файл:

Python
Скопировать код
# Оживляем текст, заряжаем его идеями Unicode
with open('file.txt', 'w', encoding='utf-8') as f:
    f.write('Unicode текст')  // Записываем наш Unicode текст

Запомните, 'utf-8' – ваш надежный инструмент для работы с Unicode-символами в файлах.

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

Python 2 и 3: Особенности версий

Python 2: ваш выбор – io.open

Во второй версии Python параметр encoding в open() не предусмотрен, но не стоит волноваться: есть io.open:

Python
Скопировать код
# Вызываем нашего спасителя
import io
with io.open('file.txt', encoding='utf-8') as f:
    text = f.read()  // И мы в курсе!

В Python 3 все проще

Python 3 уверенно смотрит на кодировку: "Я с этим справлюсь!":

Python
Скопировать код
# Просто еще один день для пользователя Python 3
with open('file.txt', encoding='utf-8') as f:
    text = f.read()  // И все как обычно, без проблем.

codecs: проверенный временем помощник

Если вам по каким-то причинам удобнее использовать codecs, вот как это сделать:

Python
Скопировать код
import codecs
with codecs.open('file.txt', 'r', 'utf-8') as f:
    text = f.readlines()  // Все сразу, целиком, без разбиения на строки!

Но будьте внимательны: смешивание read() и readline() при использовании codecs.open может привести к путанице.

Встреча с кодировками

Обработка ошибок — это целое искусство

Параметр errors в функции open позволит вам избежать проблем с кодированием/декодированием:

Python
Скопировать код
with open('file.txt', 'r', encoding='utf-8', errors='replace') as f:
    text = f.read()  // Где ошибки? Все что вижу я – это "особенности"!

Когда вам встречаются байты

Если дело касается специальных символов, откройте файл в бинарном режиме и декодируйте его:

Python
Скопировать код
with open('file.bin', 'rb') as f:
    bytes_content = f.read()
text = bytes_content.decode('utf-8')  // И никаких проблем с байтами!

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

Представьте Python как многоязычного переводчика:

Markdown
Скопировать код
Когда Python ЧИТАЕТ файл (📖), он использует UTF-8, для того чтобы понимать множество языков (🇬🇧🇯🇵🇰🇷).
А когда ЗАПИСЫВАЕТ (✍️), он говорит на всем понятном UTF-8!
Python
Скопировать код
with open('multilingual.txt', 'r', encoding='utf-8') as f:
    contents = f.read()  // 🌐 Python: искусный лингвист!

with open('multilingual.txt', 'w', encoding='utf-8') as f:
    f.write('Hello! こんにちは! 안녕하세요!')  // 🌐 Python: душа полиглота!

Путешествия по миру с Unicode обещает совместимость и плавное взаимодействие между различными платформами! 🌍⚙️🖥️

Свобода Python

Экранированные последовательности — вот где загвоздка

Перевод ASCII в Unicode требует понимания экранированных последовательностей:

В Python 2.x:

Python
Скопировать код
// '\\n' превращается обратно в новую строку!
print u'Hello\\nWorld'.decode('string_escape')

В Python 3.x:

Python
Скопировать код
// Превращаем '\\n' в '\n', потому что мы это можем!
print('Hello\\nWorld'.encode().decode('unicode_escape'))

Разделение Unicode

Знания – сила: важно понимать различия в обработке Unicode в Python 2.x и Python 3.x, чтобы избежать ненужных сложностей. В Python 2 вам было предложено использовать символ u для строк Unicode, а в Python 3 каждая строка уже сама по себе – Unicode.

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