我有一个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运行的脚本具有与我自己手动运行时相同的行为?我应该设置什么编码以及如何设置它?
答案 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 }}