【问题标题】:Read a file in byte chunks using python使用python以字节块读取文件
【发布时间】:2017-07-20 05:24:14
【问题描述】:

我正在尝试将包含超过 10 亿字节的文件转换为整数。显然,我的机器无法立即执行此操作,因此我需要对代码进行分块。我能够解码前 50,000,000 个字节,但我想知道如何读取文件中介于 50,000,001 和 100,000,000、150,000,000 和 200,000,000 等之间的整数。以下是我现在拥有的;范围函数不适用于此。

import struct
with open(x, "rb") as f:
    this_chunk = range(50000001, 100000000)
    data = f.read(this_chunk)
    ints1 = struct.unpack("I" * (this_chunk //4) , data)
    print(ints1)

【问题讨论】:

  • file.read() 已经支持定义你需要读取的大小,f.read(50000000) 会一次返回50000000。上面的代码不会抛出错误吗,我希望将range() 对象传递给f.read() 会出错。
  • @AChampion 是的,确实如此。问题是,如果我只是将 50000000 输入到 f.read 中,它会不断输出相同的数字
  • 那是因为你每次都打开文件。只打开一次文件并多次使用f.read(),即循环使用。

标签: python


【解决方案1】:

您可以使用f.seek(offset) 设置文件指针从某个偏移量开始读取。

在你的情况下,你想跳过 5000000 字节,所以你会打电话

f.seek(50000000)

此时,您需要读取另一个 50000000 字节,因此您将调用 f.read(50000000)


这将是您的完整代码清单,实现 f.seek 并读取整个文件:

with open(x, "rb") as f:
    f.seek(50000000) # omit if you don't want to skip this chunk
    data = f.read(50000000)
    while data:
        ... # do something 
        data = f.read(50000000)

【讨论】:

  • 第一个字节位于0 位置,所以我很确定寻找50000000 比进一步移动一个字节更正确。
  • @Blckknght 抱歉,感谢您指出这一点。已更正。
  • 为什么f.seek(),OP 不能一直读取f.read(50000000) 并一次处理每个50000000 字节?把它粘在一个循环里。
  • @AChampion OP 提到他们之前已经这样做了,所以他们想读取这个程序中的下一个块。至少我是这么理解的。
  • @cᴏʟᴅsᴘᴇᴇᴅ 程序会一直运行到每次偏移的文件末尾吗?
【解决方案2】:

在循环中使用f.read(50000000),它将以50000000的块形式读取文件,例如:

In []:
from io import StringIO

s = '''hello'''
with StringIO(s) as f:
    while True:
        c = f.read(2)
        if not c:
            break
        print(c)

Out[]:
he
ll
o

【讨论】:

  • 谢谢!这是有道理的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 2018-12-15
  • 1970-01-01
相关资源
最近更新 更多