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

如何在Python(含MicroPython)中将文件用作内存缓冲区?

解决方案

标准Python环境

直接用标准库的mmap模块就能满足需求——它可以把磁盘文件映射成内存中的类字节对象,完全支持你要的索引、切片操作,后台的文件读写可自动或手动控制,适配内存不足的场景。

示例用法:

import mmap

# 以读写模式打开目标文件
with open("large_file.bin", "r+b") as f:
    # 映射整个文件为mmap对象,ACCESS_WRITE支持读写
    buf = mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_WRITE)
    
    # 像操作bytearray一样使用
    buf[33] = 127  # 修改指定位置的字节
    a = buf[100:200]  # 读取切片内容
    
    # 可选:手动同步修改到磁盘(默认会自动同步)
    buf.flush()

mmap会自动缓存修改操作,不会每次都立刻写入磁盘,性能较好;如果需要严格控制同步时机,调用flush()即可。

MicroPython环境

部分MicroPython平台(如ESP32、Pyboard)原生支持mmap模块,用法和标准Python一致。如果你的平台不支持mmap,可以自定义一个类模拟类bytearray的文件操作:

class FileBuffer:
    def __init__(self, filename):
        self.f = open(filename, "r+b")
        # 获取文件总大小
        self.f.seek(0, 2)
        self.size = self.f.tell()
    
    def __getitem__(self, key):
        if isinstance(key, slice):
            start = key.start or 0
            stop = key.stop or self.size
            start = max(0, start if start >=0 else self.size + start)
            stop = min(self.size, stop if stop >=0 else self.size + stop)
            self.f.seek(start)
            return self.f.read(stop - start)
        else:
            idx = key if key >=0 else self.size + key
            if 0 <= idx < self.size:
                self.f.seek(idx)
                return ord(self.f.read(1))
            raise IndexError("FileBuffer index out of range")
    
    def __setitem__(self, key, value):
        if isinstance(key, slice):
            start = key.start or 0
            stop = key.stop or self.size
            start = max(0, start if start >=0 else self.size + start)
            stop = min(self.size, stop if stop >=0 else self.size + stop)
            if len(value) != stop - start:
                raise ValueError("Slice assignment length mismatch")
            self.f.seek(start)
            self.f.write(value)
        else:
            idx = key if key >=0 else self.size + key
            if 0 <= idx < self.size:
                self.f.seek(idx)
                self.f.write(bytes([value]))
            else:
                raise IndexError("FileBuffer index out of range")
    
    def close(self):
        self.f.close()

使用示例:

buf = FileBuffer("large_file.bin")
buf[33] = 127
a = buf[100:200]
buf.close()

这个自定义类每次操作都会直接读写文件,性能略逊于mmap,但能在内存受限的MicroPython环境中满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:40:27