В Python 2 только типы unicode
имеют метод translate
, который принимает dict
.Если вы собираетесь работать с произвольным текстом, самое простое решение здесь - просто использовать версию Python 3 open
на Py2;он будет беспрепятственно декодировать ваши входные данные и выдавать unicode
вместо str
.
Начиная с Python 2.6+, заменить обычную встроенную open
на версию Python 3 просто.Просто добавьте:
from io import open
к импорту в верхней части вашего файла.Вы также можете удалить line = ' '.join(line.split(' '))
;это определенно неоперативный (он разделяется на один пробел, чтобы создать list
, а затем воссоединяется на один пробел).Вы также можете добавить:
from __future__ import unicode_literals
к очень верху вашего файла (до всех вашего кода);это автоматически сделает все ваши обычные кавычки unicode
литералами, а не str
литералами (префикс реальных двоичных данных с b
, чтобы сделать его литералом str
на Py2, bytes
литерал на Py3).
Приведенное выше решение лучше всего, если вы можете использовать его, потому что оно заставит ваш код работать правильно как на Python 2, так и на Python 3. Если вы не можете сделать это по какой-либо причине, то вам нужно изменить свой translate
вызов для использования API Python 2 * ожидает 1033 *, что означает полное удаление определения translate_table
(в этом нет необходимости) и просто выполнение:
line = line.translate(None, string.punctuation)
для Python2 str.translate
, аргументы представляют собой таблицу сопоставления один к одному для всех значений от 0 до 255 включительно в качестве первого аргумента (None
, если сопоставление не требуется), а второй аргумент представляет собой строку символов для удаления (который string.punctuation
уже предоставляет).