【问题标题】:Buffer/stream to read a subset of a file in Python?缓冲区/流以在 Python 中读取文件的子集?
【发布时间】:2016-12-15 18:45:24
【问题描述】:

我编写了一个类,它解析数据文件的标题段(用于存储科学仪器数据)并收集文件中各种数据段的偏移量等内容。实际数据是通过读取和解析数据段的各种方法获得的。

我遇到的问题是为特定于供应商的非结构化数据定义了一个段。由于没有什么可解析的,我只需要我的方法来返回原始二进制数据。但是这个段可能非常大,所以我不想一次读完它并返回一个 bytes 对象。

我想做的是让该方法返回一个io.BufferedReader 对象或类似的对象到文件中,该文件只在开始和结束偏移之间读取。我还没有找到一种方法来使用内置的 IO 类来做到这一点。有可能吗?

【问题讨论】:

    标签: python python-3.x io


    【解决方案1】:

    您从 IOBase 继承了所有类方法,因此您绝对可以调用 reader.seek(byte_offset) 以跳到流中的此字节位置。但是,您必须从那里手动跟踪已读取的字节,直到达到您正在读取的最大偏移量。 seek() 的起始偏移量当然必须事先知道,结束字节偏移量也是如此。下面是一些示例代码(假设起始偏移量为 250 字节):

    import io
    
    stream = io.open("file.txt", "r")
    buffered_reader = io.BufferedReader(stream)
    # set the stream to byte 250
    buffered_reader.seek(250)
    # read up to byte 750 (500 bytes from position 250)
    data = buffered_reader.read(500)
    

    当然,如果此标题是动态调整大小的...您将不得不扫描以确定开始位置,这意味着逐行读取。

    【讨论】:

    • 这个问题更多的是关于 API - 我希望该方法返回一个仅从文件的该段读取的流,而调用者无需担心实际偏移量是多少。跨度>
    • 假设标题在构造中是动态的?如果是这样,必须进行扫描以确定起点。如果起始点取决于特定的标头长度,则 io 模块或其类不会自动知道每个文件的从哪里开始。
    • 也许我没有很清楚地表达这个问题。我已经解析了文件并知道偏移量在哪里。我希望这对使用该模块的任何其他代码完全透明,以便它可以简单地请求数据段的流,而无需了解文件格式或内部结构。
    猜你喜欢
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多