繁体   English   中英

在读取模式下读取二进制文件Python 3-在Windows上通过,在Linux上失败

[英]Reading a binary file in read mode Python 3 - passes on Windows, fails on Linux

我正在执行这段代码

Windows上的Python

'3.6.8 |Anaconda, Inc.| (default, Feb 21 2019, 18:30:04) [MSC v.1916 64 bit (AMD64)]'

Linux上的Python

'3.6.6 (default, Mar 29 2019, 00:03:27) \\n[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]'

该代码使用wb模式将一些字节写入文件,然后将其读取为r纯文本。 我知道我应该以字节( rb )的形式读取,但是我很好奇为什么在Windows上传递时它在Linux上会中断?

import os
import tempfile
temp_dir = tempfile.mkdtemp()
temp_file = os.path.join(temp_dir, 'write_file')

expected_bytes = bytearray([123, 3, 255, 0, 100])
with open(temp_file, 'wb') as fh:
    fh.write(expected_bytes)

with open(temp_file, 'r', newline='') as fh:
    actual = fh.read()

在Linux上引发的异常:

Traceback (most recent call last):
  File "<input>", line 11, in <module>
  File "/home/.../lib64/python3.6/codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 2: invalid start byte

获取默认系统编码(使用sys.getdefaultencoding() )在两台计算机上均显示'utf-8'

当以文本模式打开文件时,使用'rt' (默认为“ r”和“ t”)时,从文件中读取的所有内容都会进行即时透明解码并作为str对象返回,如Text中所述输入/输出

您可以在打开文件时强制使用编码,例如:

f = open("myfile.txt", "r", encoding="utf-8")

open文档中所述:

默认编码取决于平台(无论locale.getpreferredencoding()返回什么),但是可以使用Python支持的任何文本编码。 有关支持的编码列表,请参见编解码器模块。

(请注意, sys.getdefaultencoding()是无关的:它返回Unicode实现使用的当前默认字符串编码的名称。)

如注释中所述,在系统上, locale.getpreferredencoding()在Windows上为'cp1252',在Linux上为'UTF-8'。

CP-1252是单字节编码,其中每个字节对应一个字符。 因此,无论您读取什么文件,它包含的数据都可以转换为字符串。

但是, UTF-8使用可变宽度编码,其中并非所有字节序列都有效并且代表字符。 这就是为什么无法解码某些字节时尝试在Linux系统上读取文件失败的原因。

如果已将文件写为字节,则应以字节读入。

f = open("myfile.txt", "rb")

如果以文本形式(使用"r""rt" )将其读取,则将尝试将其解码为Unicode。 默认情况下使用的编码取决于平台。 但是您显然根本不希望将其解码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM