gpt4 book ai didi

python - BytesIO.truncate 方法不扩展缓冲区内容

转载 作者:行者123 更新时间:2023-12-04 10:53:03 24 4
gpt4 key购买 nike

IOBase.truncate 的文档方法说:

truncate(size=None)

Resize the stream to the given size in bytes (or the current position if size is not specified). The current stream position isn’t changed. This resizing can extend or reduce the current file size. In case of extension, the contents of the new file area depend on the platform (on most systems, additional bytes are zero-filled). The new file size is returned.

Changed in version 3.5: Windows will now zero-fill files when extending.


因此,考虑到这一点,我认为 BytesIO (即 BufferedIOBase 的子类,而后者又是 IOBase 的子类)在调用此方法后更改其内部缓冲区大小。
但以下代码片段表明我的假设是错误的:
from io import BytesIO

# prints b'\x00\x00\x00\x00\x00\x00\x00\x00'
data = BytesIO(8 * b"\x00")
print(data.getvalue())

# prints 16
print(data.truncate(16))

# prints b'\x00\x00\x00\x00\x00\x00\x00\x00'
print(data.getvalue())

# prints b'\x00\x00\x00\x00\x00\x00\x00\x00'
print(bytes(data.getbuffer()))
我哪里转错了?

最佳答案

检查 source code ,似乎文档不是最新的 BytesIO执行:

static PyObject *_io_BytesIO_truncate_impl(bytesio *self, Py_ssize_t size)
/*[clinic end generated code: output=9ad17650c15fa09b input=423759dd42d2f7c1]*/
{
CHECK_CLOSED(self);
CHECK_EXPORTS(self);

if (size < 0) {
PyErr_Format(PyExc_ValueError,
"negative size value %zd", size);
return NULL;
}

if (size < self->string_size) {
self->string_size = size;
if (resize_buffer(self, size) < 0)
return NULL;
}

return PyLong_FromSsize_t(size);

}
if (size < self->string_size) test 确保如果大小大于以前的大小,则不执行任何操作。

我的猜测是,对于真正的文件处理程序, truncate像底层平台一样工作(扩展文件),但不适用于内存映射处理程序。

如果我们知道它将失败,则可以通过在对象的末尾写入来非常简单地模拟所需的行为:
def my_truncate(data,size):
current_size = len(data.getvalue())
if size < current_size:
return data.truncate(size)
elif size == current_size:
return size # optim
else:
# store current position
old_pos = data.tell()
# go to end
data.seek(current_size)
# write zeroes
data.write(b"\x00" * (size-current_size))
# restore previous file position
data.seek(old_pos)
return size

关于python - BytesIO.truncate 方法不扩展缓冲区内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59374127/

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