聊一聊python 的readinto

python的file对象拥有readinto方法,可以直接将二进制数据写入到可变缓冲区中,实践中,写入 bytearray , bytearray 是字节数组,这个数组有多大,readinto方法就尝试将多少内容写入其中。通常,我们使用open函数打开一个文件,读取内容时,使用的都是read,readline,readlines,所返回的都是字符串,几乎不会使用到readinto方法。这是因为,我们所做的事情都偏向于业务应用,但如果你向更底层的技术去学习,就会认识到,对于数据的处理,我们需要更接近二进制的方式。

下面是一个简单的示例

import os.path
​
​
def read_into_buffer(filename):
    buf = bytearray(os.path.getsize(filename))
    with open(filename, 'rb') as f:
        f.readinto(buf)
    return buf
​
​
with open('sample.bin', 'wb') as f:
    f.write(b'Hello World')
​
buf = read_into_buffer('sample.bin')
buf[0:1] = b'h'
​
with open('sample.bin', 'wb') as f:
    f.write(buf)

注意看buf[0:1] = b'h',我通过切片的方式,直接修改了buf,如果buf的类型是字符串,这样的操作是不被允许的。如果你的工作偏向于网络底层,比如socket编程,倘若你所有的操作都是在str基础上进行,那么你不得不将bytes类型数据转换为str,要知道,socket 通信时,发送和接收的数据都是bytes类型。

操作bytes,bytearray是否会比str更快,我手头没有很有说服力的证据,如果单纯的从这三种类型数据的结构进行推理和猜测,我相信str是最慢的,对于网络底层数据的处理,比如在socket层面解析http请求的返回数据,bytes和bytearray肯定会更快,我也是在阅读python源码http.client 的时候看到了readinto的用法,一个直观的感受便是,对socket数据的处理,是不会使用str的。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案