Работа с Unicode (UTF-8) в Python: чтение и запись в файл
Быстрый ответ
Работа с UTF-8 в Python не вызывает проблем: достаточно использовать функцию open
и указать параметр encoding='utf-8'
:
Чтение файла:
# Открываем текст, полный идей
with open('file.txt', encoding='utf-8') as f:
text = f.read() # Вот так, знания у нас в кармане!
Запись в файл:
# Оживляем текст, заряжаем его идеями Unicode
with open('file.txt', 'w', encoding='utf-8') as f:
f.write('Unicode текст') // Записываем наш Unicode текст
Запомните, 'utf-8'
– ваш надежный инструмент для работы с Unicode-символами в файлах.
Python 2 и 3: Особенности версий
Python 2: ваш выбор – io.open
Во второй версии Python параметр encoding
в open()
не предусмотрен, но не стоит волноваться: есть io.open
:
# Вызываем нашего спасителя
import io
with io.open('file.txt', encoding='utf-8') as f:
text = f.read() // И мы в курсе!
В Python 3 все проще
Python 3 уверенно смотрит на кодировку: "Я с этим справлюсь!":
# Просто еще один день для пользователя Python 3
with open('file.txt', encoding='utf-8') as f:
text = f.read() // И все как обычно, без проблем.
codecs
: проверенный временем помощник
Если вам по каким-то причинам удобнее использовать codecs
, вот как это сделать:
import codecs
with codecs.open('file.txt', 'r', 'utf-8') as f:
text = f.readlines() // Все сразу, целиком, без разбиения на строки!
Но будьте внимательны: смешивание read()
и readline()
при использовании codecs.open
может привести к путанице.
Встреча с кодировками
Обработка ошибок — это целое искусство
Параметр errors
в функции open
позволит вам избежать проблем с кодированием/декодированием:
with open('file.txt', 'r', encoding='utf-8', errors='replace') as f:
text = f.read() // Где ошибки? Все что вижу я – это "особенности"!
Когда вам встречаются байты
Если дело касается специальных символов, откройте файл в бинарном режиме и декодируйте его:
with open('file.bin', 'rb') as f:
bytes_content = f.read()
text = bytes_content.decode('utf-8') // И никаких проблем с байтами!
Визуализация
Представьте Python как многоязычного переводчика:
Когда Python ЧИТАЕТ файл (📖), он использует UTF-8, для того чтобы понимать множество языков (🇬🇧🇯🇵🇰🇷).
А когда ЗАПИСЫВАЕТ (✍️), он говорит на всем понятном UTF-8!
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:
// '\\n' превращается обратно в новую строку!
print u'Hello\\nWorld'.decode('string_escape')
В Python 3.x:
// Превращаем '\\n' в '\n', потому что мы это можем!
print('Hello\\nWorld'.encode().decode('unicode_escape'))
Разделение Unicode
Знания – сила: важно понимать различия в обработке Unicode в Python 2.x и Python 3.x, чтобы избежать ненужных сложностей. В Python 2 вам было предложено использовать символ u
для строк Unicode, а в Python 3 каждая строка уже сама по себе – Unicode.