我有以下代码
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感到困惑,因为当我在另一个文件中测试它时,一切都很好。
答案 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.translate
和unicode.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
中的所有字符。 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.
答案 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