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




translate() takes exactly one argument(2 given) (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

https://code.i-harness.com

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

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, потому что все работает отлично, когда я просто тестирую его в другом файле.


Вот как работает перевод:

 yourstring.translate(str.maketrans(fromstr, tostr, deletestr)) 

Замените символы fromstr символом в том же положении в tostr и удалите все символы, которые находятся в deletestr . Из fromstr и tostr могут быть пустые строки, а параметр deletestr может быть опущен.

пример:

 str="preetideepak12345aeiou" >>> str.translate(str.maketrans('abcde','12345','p')) 

вывод:

 'r55ti4551k1234515iou' 

Вот:

 a is translated to 1 b is translated to 2 c is translated to 3 and so on and p is deleted from string. 

Я подозреваю, что ваша проблема связана с различиями между str.translate и str.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} .





typeerror