gpt4 book ai didi

python - file.read() 在 2.7 和 3.3 中返回不同的长度

转载 作者:行者123 更新时间:2023-11-28 18:44:41 25 4
gpt4 key购买 nike

我有一个二进制文件,

file = open(fname,"Ub")
len(file.read())

在 Python 3.3 中,它返回正确的 1279200。在 Python 2.7 中,它返回 1279106。

这是怎么回事?可能的原因是什么?

2.7中如何获取1279200字节?

最佳答案

长话短说,Ub 不在一起。

Python 3 遵循 PEP-3116用于 I/O 实现。如果你看open() implementation ,您会注意到 b 使用 Buffered* 接口(interface),而通用换行符在 TextIOWrapper 中实现.因此,传递 b 只是禁用支持通用换行符的代码。

事实上,如果您尝试同时启用二进制模式和通用换行符,open() 的实现甚至会失败。但是,这段代码根本不支持 U 模式参数,只支持显式的 newline 参数。

现在,我不知道为什么U在实际实现中不会触发错误。也许这只是一个遗漏,也许是为了向后兼容。

现在,Python 2 有两个 I/O 实现。如果您使用 io.open(),您将获得与 Python 3 相同的行为。但是,您使用的是通过 C 实现的遗留 open() file type (相关代码:open()field settingget_line()),并且这段代码没有明确区分二进制文件和文本文件支持。因此,通用换行支持也适用于二进制文件。

因此,总结一下:您正在尝试使用两种相互冲突的文件模式。在 Python 3 中,这可能会触发错误,但由于某种原因不会。相反,bU 强,后者不起作用。在 Python 2 中,代码在二进制文件和文本文件之间没有明确的划分,bU 都受到尊重,具体取决于上下文。


快速测试:

$ printf '1\n2\r\n3\n\r4\r5' > f
$ ipython3.3
In [1]: open('f', 'Ub').read()
Out[1]: b'1\n2\r\n3\n\r4\r5'

$ ipython2.7
In [1]: import io

In [2]: io.open('f', 'Ub').read()
Out[2]: '1\n2\r\n3\n\r4\r5'

In [3]: open('f', 'Ub').read()
Out[3]: '1\n2\n3\n\n4\n5'

关于python - file.read() 在 2.7 和 3.3 中返回不同的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21901737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com