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
相关产品推荐
相关产品推荐

