Str.translate дает TypeError - Translate принимает один аргумент (2 данный), работал в Python 2

У меня есть следующий код

import nltk, os, json, csv, string, cPickle
from scipy.stats import scoreatpercentile

lmtzr = nltk.stem.wordnet.WordNetLemmatizer()

def sanitize(wordList): 
answer = [word.translate(None, string.punctuation) for word in wordList] 
answer = [lmtzr.lemmatize(word.lower()) for word in answer]
return answer

words = []
for filename in json_list:
    words.extend([sanitize(nltk.word_tokenize(' '.join([tweet['text'] 
                   for tweet in json.load(open(filename,READ))])))])

Я тестировал строки 2-4 в отдельном файле test.py, когда писал

import nltk, os, json, csv, string, cPickle
from scipy.stats import scoreatpercentile

wordList= ['\'the', 'the', '"the']
print wordList
wordList2 = [word.translate(None, string.punctuation) for word in wordList]
print wordList2
answer = [lmtzr.lemmatize(word.lower()) for word in wordList2]
print answer

freq = nltk.FreqDist(wordList2)
print freq

и командная строка возвращает ['the', 'the', 'the'], что я хотел (удаление пунктуации).

Однако, когда я помещаю тот же самый код в другой файл, python возвращает TypeError, заявляя, что

File "foo.py", line 8, in <module>
  for tweet in json.load(open(filename, READ))])))])
File "foo.py", line 2, in sanitize
  answer = [word.translate(None, string.punctuation) for word in wordList]
TypeError: translate() takes exactly one argument (2 given)

json_list - это список всех путей к файлу (я печатаю и проверяю, что этот список действителен). Я запутался в этом TypeError, потому что все работает отлично, когда я просто тестирую его в другом файле.

Ответ 1

Я подозреваю, что ваша проблема связана с различиями между str.translate и unicode.translate (это также различия между str.translate на Python 2 и Python 3). Я подозреваю, что ваш исходный код отправляется экземплярам unicode, в то время как ваш тестовый код использует обычные 8-разрядные экземпляры str.

Я не предлагаю преобразовывать строки Unicode в обычные экземпляры str, так как unicode - гораздо лучший тип для обработки текстовых данных (и это будущее!). Вместо этого вы должны просто адаптироваться к новому синтаксису unicode.translate. С помощью регулярного str.translate (на Python 2) вы можете передать необязательный аргумент deletechars, и символы в нем будут удалены из строки. Для unicode.translatestr.translate на Python 3) дополнительный аргумент больше не разрешен, но записи таблицы перевода с None, поскольку их значение будет удалено из вывода.

Чтобы решить проблему, вам нужно создать соответствующую таблицу переводов. Таблица переводов - это сопоставление словаря из ординалов Юникода (то есть int s) в ординалы, строки или None. Вспомогательная функция для их создания существует в Python 2 как string.maketrans (и Python 3 как метод типа str), но версия Python 2 не обрабатывает случай, о котором мы заботимся (помещая None значения в таблицу). Вы можете создать соответствующий словарь самостоятельно с чем-то вроде {ord(c): None for c in string.punctuation}.

Ответ 2

Если все, что вы хотите сделать, это сделать то же самое, что вы делали в Python 2 в Python 3, вот что я делал в Python 2.0, чтобы выбросить знаки препинания и цифры:

text = text.translate(None, string.punctuation)
text = text.translate(None, '1234567890')

Вот мой эквивалент Python 3.0:

text = text.translate(str.maketrans('','',string.punctuation))
text = text.translate(str.maketrans('','','1234567890'))

В основном он говорит: "ничего не переводить" (первые два параметра) и переводить любые знаки препинания или цифры на None (т.е. удалять их).

Ответ 3

Python 3.0:

text = text.translate(str.maketrans('','','1234567890'))

static str.maketrans(x [, y [, z]])

Этот статический метод возвращает таблица перевода, используемая для str.translate().

Если есть только один аргумент, это должен быть словарь, сопоставляющий ординалы Unicode (целые числа) или символы (строки длиной 1) с порядковыми номерами Unicode, строками (произвольной длины) или None. Символьные ключи затем преобразуются в ординалы.

Если есть два аргумента, они должны быть строками равной длины, и в результирующем словаре каждый символ в x будет отображаться на символ в том же положении в y. Если есть третий аргумент, это должна быть строка, символы которой будут отображаться в None в результате.

https://docs.python.org/3/library/stdtypes.html?highlight=maketrans#str.maketrans