Python: решение юникодного ада с помощью unidecode

Я работал над способами сглаживания текста в ascii. Итак à a и - n и т.д.

unidecode был фантастическим для этого.

# -*- coding: utf-8 -*-
from unidecode import unidecode
print(unidecode(u"ā, ī, ū, ś, ñ"))
print(unidecode(u"Estado de São Paulo"))

Выдает:

a, i, u, s, n
Estado de Sao Paulo

Однако я не могу дублировать этот результат с данными из входного файла.

Содержимое файла test.txt:

ā, ī, ū, ś, ñ
Estado de São Paulo

# -*- coding: utf-8 -*-
from unidecode import unidecode
with open("test.txt", 'r') as inf:
    for line in inf:
        print unidecode(line.strip())

Выдает:

A, A<<, A<<, A, A+-
Estado de SAPSo Paulo

и

RuntimeWarning: Аргумент не является объектом unicode. Передача закодированной строки, скорее всего, приведет к неожиданным результатам.

Вопрос. Как я могу прочитать эти строки как unicode, чтобы передать их в unidecode?

Ответ 1

Используйте codecs.open

with codecs.open("test.txt", 'r', 'utf-8') as inf:

Ответ 2

import codecs
with codecs.open('test.txt', encoding='whicheveronethefilewasencodedwith') as f:
    ...

Модуль codecs предоставляет функцию для открытия файлов с автоматической кодировкой/декодированием Unicode, между прочим.