Python编码错误? Unicode解码错误: 'ascii' codec can't decode byte ordinal not in range(128)

标签 python amazon-web-services encoding aws-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 运行的脚本具有与我自己手动运行脚本时相同的行为?我应该设置什么编码以及如何设置?

最佳答案

您的文件已编码,这意味着它以定义的方式表示 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/

相关文章:

android - 使用适用于 Java 的 AWS 开发工具包创建 AmazonSNSClient 时出现 NoClassDefFoundError

C#:来自带有 MySQL 的字符串的 Unicode

perl - 如何为 GET 请求绕过 LWP 的 URL 编码?

python - 我怎样才能等到线程完成其进程?

php - 替换已弃用的函数 mysql_connect

amazon-web-services - Cloudfront 等 CDN 对发行版中可存储的最大缓存量有限制吗?

javascript - 位于 HTML 文件中的 Angular 变量中的特殊字符

python - 有什么方法可以在 vscode 调试器中出现不可预见的异常时继续执行吗?

Python 如何使用枚举和列表跳过第一次(即零次)迭代?

python - 杀死 python curses 程序后终端显示中断