python的read_聊一聊python 的readinto

聊一聊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的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值