发现您的问题:
通过编码后,
precs.open返回
StreamReaderWriter,实际上只是一个包装器( 不是
其子类;它是“由……组成”的关系,而不是继承)
StreamReader和
StreamWriter。问题是:
StreamReaderWriter
提供一个“普通”read
方法(即,它带有一个size
参数就可以了)- 它委托给内部
StreamReader.read
方法,其中size
参数仅是要读取的字节数的提示,而不是限制。在 第二个 参数,chars
是一个严格的限制,但StreamReaderWriter
从来没有经过这样的说法沿(不接受) - 当有
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或更高版本,它就可以使用,并且会更好。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)