【问题标题】:Google App Engine and string.translate doesn't workGoogle App Engine 和 string.translate 不起作用
【发布时间】:2012-06-02 17:33:47
【问题描述】:

我正在编写一些简单的脚本来将文本与 rot13 相互转换。所以在适当的类里面我有这个:

def post(self): 
dict = string.maketrans("ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz", "NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm")

code = self.request.get("text")
code = string.translate(code, dict)

它可以很好地获取参数“文本”,但在 .translate 中它会因内部服务器错误而爆炸:

      File "<mypath>\main.py", line 46, in post
    code = string.translate(code, dict)
  File "C:\Python27\lib\string.py", line 498, in translate
    return s.translate(table + s[:0])
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 128: ordinal not in range(128)

我的代码有什么问题?

【问题讨论】:

  • 这纯粹是一个 Python 问题 - 与 App Engine 无关。此外,dict 是一个非常糟糕的变量名称,因为它也是一个内置类型的名称。

标签: python google-app-engine


【解决方案1】:
a = "This is a string".encode("rot13")
b = a.decode("rot13")
print b

它的 python ;D 它完全符合您的要求。

Unicode 版本的 translate 需要来自 Unicode 的映射 序数(您可以使用 ord 检索单个字符)到 Unicode 序数。如果要删除字符,则映射到 None。

我改变了你的函数来构建一个 dict 映射每个的序数 字符到你想翻译的序数:

def translate_non_alphanumerics(to_translate, translate_to=u'_'):
    not_letters_or_digits = u'!"#%\'()*+,-./:;<=>?@[\]^_`{|}~'
    translate_table = dict((ord(char), translate_to) for char in not_letters_or_digits)
    return to_translate.translate(translate_table)

>>> translate_non_alphanumerics(u'<foo>!') u'_foo__'

edit:原来翻译映射必须从Unicode序数映射 (通过 ord)到另一个 Unicode 序数、Unicode 字符串或无 (删除)。因此,我将 translate_to 的默认值更改为 是一个 Unicode 文字。例如:

>>> translate_non_alphanumerics(u'<foo>!', u'bad') u'badfoobadbad'

【讨论】:

  • 哈哈,谢谢,这就是我喜欢学习 Python 的原因,很快它就可以洗碗了 :D 但是,我很好奇为什么上面的代码不起作用,对我来说似乎很好.
  • @Straightfw 注意带有翻译功能的 str 和 unicode 字符串:*.com/a/1324114/624829
  • 别担心,我总是这样 :)
  • 据我所知,这不适用于 python 3。还有比这更好的方法吗?
  • Fwiw,'repr' 解决了我同样的问题,没有外部函数等。这可能更简单更好。 ;-)
最近更新 更多