我有一个 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 运行的脚本具有与我自己手动运行脚本时相同的行为?我应该设置什么编码以及如何设置?
最佳答案
您的文件已编码,这意味着它以定义的方式表示 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
)时,这个错误才会重现 - 在这种情况下,不需要在字符串前面添加带有 u
的文字。
关于Python编码错误? Unicode解码错误: 'ascii' codec can't decode byte ordinal not in range(128),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30638230/