web-dev-qa-db-fra.com

str.translate donne TypeError - Traduire prend un argument (2 donné), travaillé Python 2

J'ai le code suivant

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))])))])

J'ai testé les lignes 2 à 4 dans un fichier testing.py séparé lorsque j'ai écrit

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

et la commande Invite retourne ['le', 'le', 'le'], ce qui est ce que je voulais (supprimer la ponctuation).

Cependant, lorsque je mets exactement le même code dans un fichier différent, python renvoie une TypeError indiquant que

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 est une liste de tous les chemins de fichiers (j’ai imprimé et vérifié que cette liste est valide). Je suis confus sur ce TypeError parce que tout fonctionne parfaitement bien lorsque je le teste dans un fichier différent.

48
carebear

Si tout ce que vous cherchez à accomplir est de faire la même chose que vous faisiez dans Python 2 dans Python 3, voici ce que je faisais dans Python 2.0 pour éliminer la ponctuation et les chiffres :

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

Voici mon équivalent Python 3.0:

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

Fondamentalement, il est écrit "ne rien traduire en rien" (les deux premiers paramètres) et traduit toute ponctuation ou tout chiffre en None (c'est-à-dire les supprimer).

82
drchuck

Je suppose que votre problème a à voir avec les différences entre str.translate Et unicode.translate (Ce sont aussi les différences entre str.translate Sur Python 2 par rapport à Python 3). Je soupçonne que votre code original est en cours d'envoi d'instances unicode alors que votre code de test utilise des instances régulières str à 8 bits.

Je ne suggère pas de reconvertir les chaînes Unicode en instances normales str, car unicode est un type bien meilleur pour la gestion des données de texte (et c'est l'avenir!). Au lieu de cela, vous devriez simplement vous adapter à la nouvelle syntaxe unicode.translate. Avec un str.translate Normal (le Python 2), vous pouvez passer un argument facultatif deletechars et les caractères qu'il contient seraient supprimés de la chaîne. Pour unicode.translate (Et str.translate On Python 3), l'argument supplémentaire n'est plus autorisé, mais les entrées de la table de traduction avec la valeur None seront supprimé de la sortie.

Pour résoudre le problème, vous devez créer une table de traduction appropriée. Une table de traduction est un dictionnaire mappant des ordinaux Unicode (c'est-à-dire, int s) vers des ordinaux, des chaînes ou None. Une fonction d'assistance pour les créer existe dans Python 2 sous la forme string.maketrans (Et Python 3 sous la forme d'une méthode de str type), mais la version Python 2 ne traite pas le cas qui nous intéresse (insérer les valeurs None dans la table). Vous pouvez créer vous-même un dictionnaire approprié avec quelque chose comme {ord(c): None for c in string.punctuation}.

69
Blckknght

Voici comment traduire fonctionne:

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

Remplacez les caractères dans fromstr par le caractère identique à tostr et supprimez tous les caractères se trouvant dans deletestr. Les fromstr et tostr peuvent être des chaînes vides et le paramètre deletestr peut être omis.

exemple:

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

sortie:

'r55ti4551k1234515iou'

ici:

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

Python 3.0:

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

statique str.maketrans (x [ y [ z]])

Cette méthode statique retourne une table de traduction utilisable pour str.translate().

S'il n'y a qu'un seul argument, il doit s'agir d'un dictionnaire mappant des ordinaux Unicode (entiers) ou des caractères (chaînes de longueur 1) sur des ordinaux Unicode, des chaînes (de longueur arbitraire) ou None. Les clés de personnage seront ensuite converties en ordinaux.

S'il y a deux arguments, il doit s'agir de chaînes de longueur égale et, dans le dictionnaire résultant, chaque caractère de x sera associé au caractère situé à la même position dans y. S'il existe un troisième argument, il doit s'agir d'une chaîne dont les caractères seront mappés à None dans le résultat.

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

4
ChuQuan