Python如何按指定字节大小(如150B)分块读取文件至末尾
你现有代码的核心问题
- 语法逻辑错位:
for stream in file是Python文件对象的逐行迭代语法,本质是按换行符定位读取位置,和你需要的按150字节固定大小切块的需求完全不匹配。同时循环变量名和之前存分块的列表stream重名,第一次循环就会把之前初始化的列表覆盖为逐行读到的字符串,后续追加操作完全失效。 - 读写指针冲突:文件对象的逐行迭代逻辑和
read(size)方法共用同一个读写指针,两套读取逻辑混用时,实际读取的位置会互相干扰,根本没法得到大小规整的150字节块。
核心实现依据
Python的文件read(size)方法本身自带文件末尾判断:当读取位置到达文件末尾时,会返回长度为0的空值(文本模式下是空字符串'',二进制模式下是空字节串b''),不需要额外手动查找结束标记。
完全不需要用逐行迭代的写法,直接循环调用read(150)直到返回空值即可。
正确的分块实现
以严格匹配PDU 150字节固定长度的要求为例,用二进制模式打开boot文件即可保证每个块的长度符合规范:
# 定义PDU固定块大小 BLOCK_SIZE = 150 boot_chunks = [] # 用上下文管理器打开boot文件 with open("你的boot文件路径", "rb") as f: while True: # 按指定大小读取字节块 current_block = f.read(BLOCK_SIZE) # 读到空值说明已经到文件末尾,退出循环 if not current_block: break boot_chunks.append(current_block)
如果需要按文本格式处理块内容,只需要把打开模式从"rb"改成"r"、指定对应编码即可,循环读取的逻辑完全通用。
实现注意事项
- 最后一个分块的长度不足150字节是正常情况,不需要硬补空格或空字符凑满150长度,可以在自定义PDU的头部字段标记当前块的实际长度,服务端拼接的时候收到长度不足150的块就可以识别这是文件的最后一块。
- 因为boot是文本文件,如果用文本模式打开传输,一定要保证客户端的文本编码和C语言服务端解析报文时使用的编码一致,避免传输后出现乱码。
- 用
with上下文管理器操作文件,读完后会自动释放文件句柄,不需要手动调用close()。
内容的提问来源于stack exchange,提问作者ferranad
相关产品推荐
相关产品推荐

