str.translate给出TypeError - Translate接受一个参数(给定2个),在Python 2中工作

时间:2014-04-19 21:32:28

标签: python nltk typeerror

我有以下代码

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

当我写

时,我在单独的testing.py文件中测试过2-4行
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感到困惑,因为当我在另一个文件中测试它时,一切都很好。

5 个答案:

答案 0 :(得分:79)

如果你想要完成的只是做你在Python 3中用Python 2做的同样的事情,那么我在Python 2.0中做的就是抛弃标点符号和数字:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim c As Range
    Dim sh As Worksheet
    Set sh = ActiveSheet    'Tip 4
    Dim rng As Range
    Set rng = sh.UsedRange.Cells

    For Each c In rng
        With c  'Tip 3
            If ispcname(.Value) Or isip(.Value) Then  'Tip 1
                sh.Hyperlinks.Add Anchor:=c, Address:=vbNullString    'Tips 4 and 9
                .HorizontalAlignment = xlCenter
                .Value = StrConv(.Value, vbProperCase)  'Tip 7
                .Font.Name = "Arial"
                .Font.Size = 10     'Tip 10
            End If  'Pretty sure this should be an ElseIf structure here.
            If Right$(.Value, 1) = "$" Then  'Tips 5 and 7.
                y = .Column
                x = .Row
                Dim i As Long   'Tip 8
                For i = 1 To rng.Rows.Count     'This is most likely wrong.
                    'Tip 2 used to be here.
                    If LCase$(sh.Cells(i, y).Value) = "backup" Then     'Tips 1, 5, and 6
                        .Value = sh.Cells(x, y - 2).Value & "$"   'Tips 4, 6, and 7
                        sh.Hyperlinks.Add Anchor:=c, Address:=vbNullString    'Tips 4 and 9
                        .Font.Name = "Calibri"
                        .Font.Size = 10     'Tip 10
                        .HorizontalAlignment = xlCenter
                        .Font.Color = RGB(192, 0, 0)
                    End If
                Next i
            End If
        End With
    Next c
End Sub

这是我的Python 3.0等价物:

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

基本上它说'什么也没有翻译'&#39; (前两个参数)并将任何标点或数字转换为text = text.translate(str.maketrans('','',string.punctuation)) text = text.translate(str.maketrans('','','1234567890')) (即删除它们)。

答案 1 :(得分:68)

我怀疑您的问题与str.translateunicode.translate之间的差异有关(这些也是Python 2上的str.translate与Python 3之间的差异)。我怀疑您的原始代码是在发送unicode实例时,而您的测试代码是使用常规的8位str实例。

我不建议将Unicode字符串转换回常规str实例,因为unicode是处理文本数据的更好类型(并且它是未来!)。相反,您应该只适应新的unicode.translate语法。使用常规str.translate(在Python 2上),您可以传递一个可选的deletechars参数,其中的字符将从字符串中删除。对于unicode.translate(以及Python 3上的str.translate),不再允许使用额外参数,但将从输出中删除以None为值的转换表条目。

要解决此问题,您需要创建适当的转换表。转换表是从Unicode序数(即int s)到序数,字符串或None的字典映射。用于制作它们的辅助函数在Python 2中作为string.maketrans(和Python 3作为str类型的方法)存在,但它的Python 2版本不处理我们关心的情况(将None值放入表中)。您可以使用{ord(c): None for c in string.punctuation}

之类的东西自己构建一个合适的字典

答案 2 :(得分:5)

这是翻译的工作方式:

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

fromstr中的字符替换为tostr中的字符 并删除deletestr中的所有字符。 fromstrtostr可以是 空字符串和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.

答案 3 :(得分:4)

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

答案 4 :(得分:0)

如果您只想实现以下内容:"123hello.jpg".translate(None, 0123456789"),请尝试以下操作:

 "".join(c for c in "123hello.jpg" if c not in "0123456789")

输出:hello.jpg