使用python读取字节块中的文件

使用python读取字节块中的文件,python,Python,我正在尝试将一个包含超过10亿字节的文件转换为整数。显然,我的机器无法同时执行此操作,因此我需要将代码分块。我能够解码第一个50000000字节,但我想知道如何读取文件中介于50000001和100000000、15000000和200000000之间的整数;范围功能不适用于此 import struct with open(x, "rb") as f: this_chunk = range(50000001, 100000000) data = f.read(this_chun

我正在尝试将一个包含超过10亿字节的文件转换为整数。显然,我的机器无法同时执行此操作,因此我需要将代码分块。我能够解码第一个50000000字节,但我想知道如何读取文件中介于50000001和100000000、15000000和200000000之间的整数;范围功能不适用于此

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)
您可以使用设置文件指针以从某个偏移量开始读取

在您的情况下,您希望跳过
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)
在循环中使用
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

file.read()
已经支持定义需要读取的大小,
f.read(50000000)
将一次返回
50000000
。上面的代码不会引发错误吗?我希望将
range()
对象传递到
f中。read()
会出错。@AChampion是的,会。问题是,如果我只是在f中输入50000000,read会持续输出相同的数字,这是因为您每次都打开文件。只打开文件一次,并多次使用
f.read()
,即将其放入循环中。第一个字节位于
0
位置,因此我非常确定,查找
50000000
比进一步查找一个字节更正确。@Blckknght抱歉,感谢您指出这一点。更正。为什么OP不能一直读取
f.read(50000000)
并一次处理每个
50000000
字节?把它放在一个循环中。@AChampion OP提到他们以前已经做过,所以他们想读这个程序中的下一个块。至少我是这么理解的。@cᴏʟᴅsᴘᴇᴇᴅ 程序会一直运行到每次文件偏移结束吗?谢谢!这是有道理的:)