Я хочу написать программу 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 выполняется обработка кодировки исходного кода?