【问题标题】:str.translate gives TypeError - Translate takes one argument (2 given), worked in Python 2str.translate 给出 TypeError - Translate 接受一个参数(给定 2 个),在 Python 2 中工作
【发布时间】:2014-06-04 05:50:34
【问题描述】:

我有以下代码

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 感到困惑,因为当我只是在不同的文件中测试它时,一切都运行良好。

【问题讨论】:

  • 可能会发生这种情况,因为此文件中使用了另一种编码(例如 utf8),translate 函数只获取一个参数。我不确定,但这可能吗?您可以通过为每种情况打印 type(wordList) 来检查这一点。
  • 你能展示你的导入语句吗?也许您在不知不觉中导入了翻译功能。遇到异常时尝试“打印翻译”并查看它来自哪个模块
  • @Spaceghost,导入语句为:import nltk, os, json, csv, string, cPicklefrom scipy.stats import scoreatpercentile (2 separate lines)
  • 即使在添加导入后,您在第二个文件中的示例代码也不会运行,因为您遗漏了创建 lmtzr 的代码。
  • 如上所示,您的代码不完整。没有其他人可以使用它并运行它来查看它的作用。

标签: python nltk typeerror


【解决方案1】:

如果你只想实现这样的东西:"123hello.jpg".translate(None, 0123456789") 那么试试这个:

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

输出:你好.jpg

【讨论】:

    【解决方案2】:

    Python 3.0:

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

    静态 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

    【讨论】:

      【解决方案3】:

      如果您想要完成的只是在 Python 3 中做与在 Python 2 中所做的相同的事情,那么我在 Python 2.0 中所做的就是丢弃标点符号和数字:

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

      这是我的 Python 3.0 等效项:

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

      基本上它说“什么都不翻译”(前两个参数)并将任何标点符号或数字翻译成None(即删除它们)。

      【讨论】:

      • 您可以简单地使用text.translate(str.maketrans('', '', string.punctuation + '1234567890')) 或更好的text.translate(str.maketrans('', '', string.punctuation + string.digits)) 组合这两个地图。我会先将翻译映射存储在一个单独的常量中并重新使用它。
      • 使用这个text = text.translate(str.maketrans('','',string.punctuation)) 为我工作
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-06-24
        • 1970-01-01
        • 2017-01-15
        • 2021-12-04
        • 1970-01-01
        • 1970-01-01
        • 2022-10-13
        • 2019-09-12
        • 2016-02-03
        相关资源
        最近更新 更多