Написание UTF-8 дружественных парсеров на python - PullRequest
0 голосов
/ 05 июля 2011

Я написал простой анализатор и средство записи файлов, но потом натолкнулся на статью, рассказывающую о важности Unicode, и мне пришло в голову, что я предполагаю, что входной файл закодирован как ASCII, что, возможно, не совсем так. время, хотя это было бы редко в моей ситуации.

В этих редких случаях я ожидаю файлы в кодировке UTF-8.

Есть ли способ работы с файлами UTF-8, просто изменив способ чтения и записи? Все, что я делаю со строками - это сохраняю их, а затем записываю, поэтому мне просто нужно убедиться, что я могу их прочитать, сохранить и правильно написать.

Кроме того, должен ли я обрабатывать файлы ascii и UTF-8 отдельно и писать разные функции для каждого из них? Я еще не работал ни с чем, кроме файлов ascii, и читал только об обработке юникода.

Ответы [ 4 ]

3 голосов
/ 05 июля 2011

Если вы используете Python 2, вы можете просто изменить все ваши str объекты на unicode объекты.Объекты Unicode имеют все те же методы, что и строки, но кодируются в формате Unicode вместо ASCII.См. http://docs.python.org/library/functions.html#unicode.

Если вы используете Python 3, строки кодируются в UTF-8 по умолчанию.

3 голосов
/ 05 июля 2011

Python изначально поддерживает Unicode. Если вы непосредственно читаете и пишете из первого файла во второй, то никакие данные не теряются, поскольку они копируют байты дословно. Однако если вы декодируете строку, а затем перекодируете ее, вам необходимо убедиться, что вы используете правильную кодировку.

2 голосов
/ 06 июля 2011

Если вы используете Python 2.6 или новее, вы можете использовать библиотеку io и ее метод io.open, чтобы открыть нужные файлы.У него есть аргумент encoding, который в вашем случае должен быть установлен на 'utf-8'.Когда вы читаете или записываете возвращенные файловые объекты, строка автоматически вводится / декодируется.

В любом случае вам не нужно делать что-то особенное для ASCII, потому что UTF-8 является надмножеством ASCII.

0 голосов
/ 06 июля 2011

Пока вы только читаете и пишете в файлы и не ожидаете какого-либо другого типа кодированного ввода, вам не нужно делать ничего особенного.

% cat /tmp/u
π is 3.14.

% file /tmp/u
/tmp/u: UTF-8 Unicode text

% cat f.py
f = open('/tmp/u', 'r')
d = f.read()
print d.split()
f.close()

% python f.py 
['\xcf\x80', 'is', '3.14.']

Это изменяется, когда вы объявляете или принимаете стандартный ввод с использованием UTF-8.

% cat g.py
s = 'π is 3.14.'
print s.split()

% python g.py
  File "g.py", line 1
SyntaxError: Non-ASCII character '\xcf' in file g.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

Для правильной обработки объявите кодировку для программы Python в начале для PEP 263 (на что ссылается исключение SyntaxError выше).

% cat h.py
# -*- coding: utf-8 -*-
s = 'π is 3.14.'
print s.split()

% python h.py
['\xcf\x80', 'is', '3.14.']
...