Работа с числами UTF-8 в Python - PullRequest
11 голосов
/ 02 марта 2010

Предположим, я читаю файл, содержащий 3 числа, разделенных запятыми.Файл был сохранен с неизвестной кодировкой, пока я имею дело с ANSI и UTF-8.Если файл был в UTF-8 и имел 1 строку со значениями 115,113,12, то:

with open(file) as f:
    a,b,c=map(int,f.readline().split(','))

выкинуло бы это:

invalid literal for int() with base 10: '\xef\xbb\xbf115'

Первое число всегда искажено этими'\ xef \ xbb \ xbf' символы.Для остальных 2 чисел конвертация работает нормально.Если я вручную заменю '\ xef \ xbb \ xbf' на '', а затем выполню преобразование int, оно будет работать.

Есть ли лучший способ сделать это для любого типа кодированного файла?

Ответы [ 2 ]

17 голосов
/ 02 марта 2010
import codecs

with codecs.open(file, "r", "utf-8-sig") as f:
    a, b, c= map(int, f.readline().split(","))

Это работает в Python 2.6.4. Вызов codecs.open открывает файл и возвращает данные в формате Unicode, декодируя из UTF-8 и игнорируя исходную спецификацию.

13 голосов
/ 02 марта 2010

То, что вы видите, это кодировка UTF-8 BOM или "Порядок следования байтов". Спецификация обычно не используется для файлов UTF-8, поэтому лучшим способом ее обработки может быть открытие файла с кодеком UTF-8 и пропуск символа U+FEFF, если он имеется.

...