Python3相当于Python2遇到UnicodeDecodeErrors时打开
Python3 equivalent to Python2 open when encountering UnicodeDecodeErrors
我有一个脚本正试图从 python2 移植到 python3。
我确实通读了移植文档,https://docs.python.org/3/howto/pyporting.html。
我原来的 python2 脚本使用了 open('filename.txt)
。在移植到 python3 时,我将其更新为 io.open('filename.txt')
。现在,当 运行 脚本作为 python2 或 python3 使用相同的输入文件时,我会收到一些错误,例如 UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 793: invalid start byte
.
python2 open
的错误检查是否没有 io.open
严格,或者它使用不同的默认编码? python3 是否有等效的方法来调用 io.open
以匹配 open
中内置的 python2?
目前我已经开始使用有效的 f = io.open('filename.txt', mode='r', errors='replace')
。并将输出与原始 python2 版本进行比较,没有重要数据因替换错误而丢失。
首先,io.open
是open
;没有必要直接停止使用 open
。
问题是您对 open
的调用是 假设 文件是 UTF-8 编码的,而实际上不是。您必须明确提供正确的编码。
open('filename.txt', encoding='iso-8859') # for example
(请注意,默认编码为 platform-specific,但您的错误表明您实际上默认为 UTF-8。)
在Python 2中,没有尝试解码non-ASCII个文件;从文件读取返回一个 str
值,该值由实际存储在文件中的任何字节组成。
这是 Python 3 中整体转变的一部分,从使用旧的 str
类型有时是文本,有时是字节,到使用 str
专门用于 Unicode 文本和 bytes
用于文本的任何特定编码。
我有一个脚本正试图从 python2 移植到 python3。
我确实通读了移植文档,https://docs.python.org/3/howto/pyporting.html。
我原来的 python2 脚本使用了 open('filename.txt)
。在移植到 python3 时,我将其更新为 io.open('filename.txt')
。现在,当 运行 脚本作为 python2 或 python3 使用相同的输入文件时,我会收到一些错误,例如 UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 793: invalid start byte
.
python2 open
的错误检查是否没有 io.open
严格,或者它使用不同的默认编码? python3 是否有等效的方法来调用 io.open
以匹配 open
中内置的 python2?
目前我已经开始使用有效的 f = io.open('filename.txt', mode='r', errors='replace')
。并将输出与原始 python2 版本进行比较,没有重要数据因替换错误而丢失。
首先,io.open
是open
;没有必要直接停止使用 open
。
问题是您对 open
的调用是 假设 文件是 UTF-8 编码的,而实际上不是。您必须明确提供正确的编码。
open('filename.txt', encoding='iso-8859') # for example
(请注意,默认编码为 platform-specific,但您的错误表明您实际上默认为 UTF-8。)
在Python 2中,没有尝试解码non-ASCII个文件;从文件读取返回一个 str
值,该值由实际存储在文件中的任何字节组成。
这是 Python 3 中整体转变的一部分,从使用旧的 str
类型有时是文本,有时是字节,到使用 str
专门用于 Unicode 文本和 bytes
用于文本的任何特定编码。