Je souhaite supprimer tous les signes de ponctuation d'un fichier texte à l'aide de la méthode .translate (). Cela semble bien fonctionner sous Python 2.x mais sous Python 3.4, il ne semble rien faire.
Mon code est comme suit et le résultat est identique au texte saisi.
import string
fhand = open("Hemingway.txt")
for fline in fhand:
fline = fline.rstrip()
print(fline.translate(string.punctuation))
Vous devez créer une table de traduction à l'aide de maketrans
que vous transmettez à la méthode str.translate
.
Dans Python 3.1 et versions ultérieures, maketrans
est maintenant un méthode statique sur le type str
, vous pouvez donc l'utiliser pour créer une traduction de chaque la ponctuation que vous voulez None
.
import string
# Thanks to Martijn Pieters for this improved version
# This uses the 3-argument version of str.maketrans
# with arguments (x, y, z) where 'x' and 'y'
# must be equal-length strings and characters in 'x'
# are replaced by characters in 'y'. 'z'
# is a string (string.punctuation here)
# where each character in the string is mapped
# to None
translator = str.maketrans('', '', string.punctuation)
# This is an alternative that creates a dictionary mapping
# of every character from string.punctuation to None (this will
# also work)
#translator = str.maketrans(dict.fromkeys(string.punctuation))
s = 'string with "punctuation" inside of it! Does this work? I hope so.'
# pass the translator to the string's translate method.
print(s.translate(translator))
Cela devrait produire:
string with punctuation inside of it Does this work I hope so
La signature d'appel de str.translate a été modifiée et le paramètre deletechars a apparemment été supprimé. Vous pourriez utiliser
import re
fline = re.sub('['+string.punctuation+']', '', fline)
au lieu de cela, ou créez un tableau comme indiqué dans l’autre réponse.
En python3.x, cela peut être fait en utilisant:
import string
#make translator object
translator=str.maketrans('','',string.punctuation)
string_name=string_name.translate(translator)
Je viens de comparer les trois méthodes par la vitesse. translate
est plus lent que re.sub
(avec précomilation) environ 10 fois. Et str.replace
est plus rapide que re.sub
3 fois environ. Par str.replace
je veux dire:
for ch in string.punctuation:
s = s.replace(ch, "'")