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.translate
(и str.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