【问题标题】:python using a dictionary for translate() gives me 'TypeError: expected a character buffer object'python使用字典进行翻译()给了我'TypeError:期望一个字符缓冲区对象'
【发布时间】:2015-03-05 20:42:26
【问题描述】:

为什么使用字典时 translate() 会给我TypeError: expected a character buffer object 错误?

remap = {
    'with': 'TEXT1',
    'as': 'TEXT2',
    'text_in': 'TEXT3'
    }

s = "with open(loc_path + 'sample_text.txt', 'rb') as text_in:"

ss = s.translate(remap)    
print ss

这是错误信息:

Traceback (most recent call last):
  File "C:\...\REMAP1.py", line 9, in <module>
    ss = s.translate(remap)
TypeError: expected a character buffer object
[Finished in 0.1s with exit code 1]

使用 replace() 有效:

#ss = s.translate(remap)
#print ss

s = s.replace('with', 'TEXT1')
s = s.replace('as', 'TEXT2')
s = s.replace('text_in', 'TEXT3')
print s

输出:

TEXT1 open(loc_path + 'sample_text.txt', 'rb') TEXT2 TEXT3:
[Finished in 0.1s]

【问题讨论】:

  • 是什么让您认为translate 可以这样使用?你读过the documentation吗?
  • 你想投反对票吗?它在 python 食谱中以这种方式使用,所以我想看看它是否有效。
  • @jes516:包含无效代码的 Python 食谱?不要再使用它了。

标签: python replace translate


【解决方案1】:

来自documentation(强调我的):

string.translate(s, table[, deletechars])

从 s 中删除 deletechars(如果存在)中的所有字符,然后使用 table 翻译这些字符,它必须是一个 256 个字符的字符串,给出每个字符值的翻译,索引为它的序数。

在您的代码中,remap 不满足此要求。

【讨论】:

  • 我不确定这意味着什么。是语法不正确还是字典中的值不正确?
  • @jes516:在我看来,文档非常清晰。 一个 256 个字符的字符串一个字典 似乎不是一回事。
  • 我明白这一点。我很困惑,因为我试图“纠正”在我的代码中使用 translate() 的方法,但我想没有什么需要纠正的,因为它不能与字典一起使用,只能与字符串一起使用?
  • @jes516:您可以使用string.maketrans() 来制作正确的翻译表。基本上,您将两个相等长度的字符串传递给它,定义您想要的字符到字符的映射。您不能使用它将一个单词翻译成另一个单词(这是一个多字符串替换)。通常你可能需要使用re.sub()
  • 正确。我使用了 maketrans 和 re.sub,但我在书中看到了 translate() 与字典一起使用的示例,我想尝试一下。谢谢
猜你喜欢
  • 2012-09-17
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2019-02-27
相关资源
最近更新 更多