Python AttributeError: module 'string' has no attribute 'maketrans'
18,484
Solution 1
maketrans
is deprecated in favor of new static methods
The
string.maketrans()
function is deprecated and is replaced by new static methods,bytes.maketrans()
andbytearray.maketrans()
. This change solves the confusion around which types were supported by thestring
module. Now,str
,bytes
, andbytearray
each have their ownmaketrans
andtranslate
methods with intermediate translation tables of the appropriate type.
You can use dir()
to verify that whenever you have this kind of issue:
>>> import string
>>>
>>> dir(string)
['Formatter', 'Template', '_ChainMap', '_TemplateMetaclass', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']
>>>
As you can see, there is no maketrans
in the resulted list above.
Solution 2
Py 3.9:
"abcdef".translate(str.maketrans('def', 'ghi'))
Author by
Krista Marie
Updated on July 22, 2022Comments
-
Krista Marie almost 2 years
I am receiving the below error when trying to run a command in Python 3.5.2 shell:
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. >>> folder = 'C:/users/kdotz/desktop' >>> f = open(folder + '/genesis.txt', 'r') >>> import operator, time, string >>> start=time.time() >>> genesis = {} >>> for line in f: line=line.split() for word in line: word = word.lower() new_word=word.translate(string.maketrans("",""), string.punctutation) if new_word in genesis: genesis[new_word]+=1 else: genesis[new_word]=1
Error:
Traceback (most recent call last): File "<pyshell#15>", line 5, in <module> new_word=word.translate(string.maketrans("",""), string.punctutation) AttributeError: module 'string' has no attribute 'maketrans'
What am I doing incorrectly? I import string at the top of the code. Thanks in advance for the help!