5.9 我们想将二进制数据读入到一个可变缓冲区,中间不经过任何的拷贝环节
- 可以使用readinto()方法
>>> def r_into_buffer(filename):
... buf = bytearray(os.path.getsize(filename))
... with open(filename,'rb') as f:
... f.readinto(buf)
... return buf
...
>>> with open('test.bin','wb') as f:
... f.write(b'Hello World')
...
11
>>> buf = r_into_buffer('test.bin')
>>> buf
bytearray(b'Hello World')
>>> buf[0:5]
bytearray(b'Hello')
>>> with open('new_test.bin','wb') as f:
... f.write(buf)
...
11
>>> with open('new_test.bin','rb') as f:
... f.read()
...
b'Hello World'
>>>
-
readinto()方法可用来将数据填充到任何预分配的数组中
-
和普通的read方法不同的是,readinto是为已存在的缓冲区填充内容,而不是分配新的对象然后再将他们返回。
-
可以使用readinto方法来避免额外的内存分配动作。
-
如:我们如果正在读取一个由相同大小的记录所组成的二进制文件
>>> r_s = 32
>>> buf = bytearray(r_s)
>>> with open('test.bin','rb') as f:
... while True:
... n = f.readinto(buf)
... if n < r_s:
... print("test data < 32 will break")
... break
... else:
... print("test data >32")
...
test data < 32 will break
>>>
- memoryview函数,内存映像函数,可以是我们对已经存在的缓冲区数据做处理,但是不涉及到拷贝动作,还可以修改内容
网友评论