Python编码错误? UnicodeDecodeError:' ascii'编解码器无法解码不在范围内的字节序数(128)

时间:2015-06-04 08:02:56

标签: python amazon-web-services encoding amazon-cloudformation user-data

我有一个AWS自动缩放实例。 在该实例的AMI上,我有一个文件myfile.py,其中包含以下字符串:

X5ZŒ

在我的AWS Cloudformation,LaunchConfiguration中,我有UserData在实例启动时执行以下python指令。它只是读取myfile.py并试图替换所有出现的正则表达式" X \ dZ"使用" XYZ":

myString = "XYZ".join(re.compile('X\d\Z').split(open("myfile.py", "r").read()))

产生此错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 4: ordinal not in range(128)

好。我知道字符Œ引起了麻烦,因为它是非ASCII的。但是当我从python shell手动运行相同的语句时,它可以正常运行而不会抛出任何异常。

如何强制AWS LaunchConfig的UserData运行的脚本具有与我自己手动运行时相同的行为?我应该设置什么编码以及如何设置它?

1 个答案:

答案 0 :(得分:1)

您的文件已编码,这意味着它以定义的方式表示unicode。 您使用一些文字字符串(例如XYZ),它们将与文件内容一起用于操作。这些文字字符串的编码方式与定义此代码的文件类似。

Python试图将两者强制转换为能够对其进行操作。如果将两者都转换为unicode,那就最好了。对于字符串文字,只需添加u,如下所示:u"XYZ"。对于文件,您必须告诉python编码,如果不这样,它默认为ascii。尝试:

 myString = u"XYZ".join(re.compile(u'X\d\Z').split(
     open("myfile.py", "r").read().decode('utf-8')))

在这个版本中,我使用了utf-8,它有一些正确的概率。如果您知道它不同,则必须将其替换为right one(您保存文件的编辑器可能会告诉您)。

编辑:我删除了关于控制台和环境设置的部分,这些设置不适用,如@Martijn所述。他也是正确的,如果您的字符串文字 已经隐式unicode(from __future__ import unicode_literals),则此错误只能重现 - 在这种情况下,不需要在字符串文字前加{{1 }}