codecs.open(utf-8)无法读取纯ASCII文件

codecs.open(utf-8)无法读取纯ASCII文件,第1张

codecs.open(utf-8)无法读取纯ASCII文件

发现您的问题:

通过编码后,

precs.open
返回
StreamReaderWriter
,实际上只是一个包装器( 不是
其子类;它是“由……组成”的关系,而不是继承)
StreamReader
StreamWriter
。问题是:

  1. StreamReaderWriter
    提供一个“普通”
    read
    方法(即,它带有一个
    size
    参数就可以了)
  2. 它委托给内部
    StreamReader.read
    方法,其中
    size
    参数仅是要读取的字节数的提示,而不是限制。在 第二个 参数,
    chars
    是一个严格的限制,但
    StreamReaderWriter
    从来没有经过这样的说法沿(不接受)
  3. 当有
    size
    提示但没有使用限制时
    chars
    ,如果
    StreamReader
    已缓冲数据,并且足够大以匹配
    size
    提示
    StreamReader.read
    盲目地返回缓冲区的内容,而不是根据
    size
    提示以任何方式对其进行限制(毕竟,仅
    chars
    施加 最大 返回值)

API

StreamReader.read
以及API的
size
/的含义
chars
是此处唯一记录的内容;
precs.open
返回的事实
StreamReaderWriter
不是契约性的,也不是
StreamReaderWriter
包装的事实
StreamReader
,我只是使用
ipython
??
魔术来读取
precs
模块的源代码来验证此行为。但是,无论是否有记录,这就是它的作用(可以随意阅读的源代码
StreamReaderWriter
,它全部是Python级别的,因此很容易)。

最好的解决办法是切换到

io.open
,这是在每一个标准的情况下,更快,更正确的是(
precs.open
支持怪人编解码器不转换之间
bytes
[的Py2
str
]和
str
[的Py2
unipre
],而是手柄
str
str
bytes
bytes
编码,但是这是一个令人难以置信用例有限;大多数情况下,您是在
bytes
和之间进行转换
str
。您需要做的只是import
io
而不是
precs
,并将
precs.open
行更改为:

f = io.open("test.py", encoding="utf-8")

您的其余代码可以保持不变(并且可能会以更快的速度启动)。

作为替代方案,您可以显式地绕过

StreamReaderWriter
以获得
StreamReader
read
方法并直接传递限制参数,例如change:

c = f.read(1)

至:

# Pass second, character limiting argument after size hintc = f.reader.read(6, 1)  # 6 is sort of arbitrary; should ensure a full char read in one go

我怀疑Python
Bug#8260(涉及混合

readline
read
precs.open
创建的文件对象上)在此处正式应用,即为“已修复”,但如果您阅读注释,则修复未完成(鉴于所记录的文档,可能无法完成API);随意的怪异组合,
read
并且
readline
将能够打破它。

同样,只需使用

io.open
; 只要您使用的是Python 2.6或更高版本,它就可以使用,并且会更好。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5667788.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存