You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 21:45:03