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