首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >跳过文件的某些字节并返回内容

跳过文件的某些字节并返回内容
EN

Stack Overflow用户
提问于 2016-09-30 08:02:10
回答 2查看 1.5K关注 0票数 1

给定必须跳过的字节范围列表:

代码语言:javascript
运行
复制
skip_ranges = [(1, 3), (5,7)]

和一个二进制文件:

代码语言:javascript
运行
复制
f = open('test', 'rb')

在不修改原始文件的情况下返回没有字节1-3和5-7的文件内容的最快方法是什么?

输入(文件内容):

代码语言:javascript
运行
复制
012345678

输出:

代码语言:javascript
运行
复制
048

请注意,这个问题专门涉及(可能是大的)二进制文件,所以生成器将是最好的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-30 08:07:03

您说过这个文件可能很大,所以我已经对@juanpa.arrivillaga解决方案进行了调整,使其能够以块的形式读取文件,并将各个块作为生成器:

代码语言:javascript
运行
复制
def read_ranges(filename, skip_ranges, chunk_size=1024):
    with open(filename, 'rb') as f:
        prev = -1
        for start, stop in skip_ranges:
            end = start - prev - 1

            # Go to next skip-part in chunk_size steps
            while end > chunk_size:
                data = f.read(chunk_size)
                if not data:
                    break
                yield data
                end -= chunk_size

            # Read last bit that didn't fit in chunk
            yield f.read(end)

            # Seek to next skip
            f.seek(stop + 1, 0)
            prev = stop
        else:
            # Read remainder of file in chunks
            while True:
                data = f.read(chunk_size)
                if not data:
                    break
                yield data

print list(read_ranges('test', skip_ranges))
票数 2
EN

Stack Overflow用户

发布于 2016-09-30 08:27:30

这种方法应该相对较快:

代码语言:javascript
运行
复制
ba = bytearray()
with open('test.dat','rb') as f:
    prev = -1
    for start, stop in skip_ranges:
        ba.extend(f.read(start - prev - 1))
        f.seek(stop + 1,0)
        prev = stop
    else:
        ba.extend(f.read())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39786543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档