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

Python如何使用mmap实现readlines()等效功能并解决无限循环问题

问题原因

  • mmap对象的readline()方法默认返回的是bytes字节类型,而非字符串,原有代码中用line == ""判断结束条件永远为假,因此会触发无限迭代。
  • 原有代码以文本模式打开文件,但mmap是直接映射文件的原始二进制内容,不会自动做编码解码处理,需要手动把读取到的字节转成对应编码的字符串,才能和原生file.readlines()返回字符串列表的行为对齐。

修正后可运行的完整代码

import mmap

def mmap_readlines(path: str, encoding: str = "utf-8") -> list[str]:
    lines = []
    # mmap需要二进制模式的文件描述符,必须用rb模式打开文件
    with open(path, "rb") as f:
        # 用with管理mmap对象生命周期,无需手动调用close()
        with mmap.mmap(f.fileno(), length=0, prot=mmap.PROT_READ) as m:
            while True:
                line_bytes = m.readline()
                # 读到文件末尾时readline返回空bytes,以此作为结束条件
                if not line_bytes:
                    break
                # 手动解码为字符串,和原生readlines()返回格式对齐
                lines.append(line_bytes.decode(encoding))
    return lines

# 调用示例
if __name__ == "__main__":
    print(mmap_readlines("file.txt"))

注意事项

  • 若需要和原生readlines()完全对齐,可在解码后按需处理行尾换行符,比如调用rstrip('\n')去除换行符。
  • Windows平台如果需要映射写入权限,需要调整prot和access参数,只读场景以上代码可跨平台通用。

内容的提问来源于stack exchange,提问作者Exploring

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:57:00