Я хочу написать программу на Python, которая читает файлы, содержащие текст Unicode. Эти файлы обычно кодируются с помощью UTF-8, но могут и не быть; в противном случае альтернативная кодировка будет явно объявлена в начале файла. Точнее, он будет объявлен с использованием тех же правил, что и сам Python, чтобы исходный код Python имел явно объявленную кодировку (как в PEP 0263, см. https://www.python.org/dev/peps/pep-0263/ для получения дополнительной информации). Просто для ясности, обрабатываемые файлы на самом деле не являются источником Python, но они объявляют свои кодировки (если не в UTF-8) с использованием тех же правил.
Если кто-то знает кодировку файла до его открытия, Python предоставляет очень простой способ чтения файла с автоматическим декодированием: команда codecs.open
; например, можно сделать:
import codecs
f = codecs.open('unicode.rst', encoding='utf-8')
for line in f:
print repr(line)
и каждый line
, который мы получим в цикле, будет строкой Unicode. Существует ли библиотека Python, которая выполняет аналогичные функции, но выбирает кодировку в соответствии с приведенными выше правилами (я думаю, что это правила Python 3.0)? (Например, предоставляет ли Python «файл чтения с самопровозглашенной кодировкой», который он использует для чтения исходного кода на язык?) Если нет, то какой самый простой способ достичь желаемого эффекта?
Одна мысль состоит в том, чтобы открыть файл с помощью обычного open
, прочитать первые две строки, интерпретировать их как UTF-8, найти объявление кодирования, используя регулярное выражение в PEP, и, если найдется один, начать декодировать все последующие строки с использованием объявленной кодировки. Чтобы это работало, нам нужно знать, что для всех кодировок, которые Python допускает в исходном коде Python, обычный Python readline
будет правильно разбивать файл на строки - то есть нам нужно знать, что для всех кодировок Python допускает в исходном тексте Python, что байтовая строка '\ n' всегда означает новую строку и не является частью какой-либо многобайтовой последовательности, кодирующей другой символ. (На самом деле мне также нужно беспокоиться о '\ r \ n'.) Кто-нибудь знает, правда ли это? Документы не были очень конкретными.
Еще одна мысль - заглянуть в исходники Python. Кто-нибудь знает, где в исходном коде Python выполняется обработка исходного кода-кодирования?