使用python读取字节块中的文件
我正在尝试将一个包含超过10亿字节的文件转换为整数。显然,我的机器无法同时执行此操作,因此我需要将代码分块。我能够解码第一个50000000字节,但我想知道如何读取文件中介于50000001和100000000、15000000和200000000之间的整数;范围功能不适用于此使用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
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ᴘᴇᴇᴅ 程序会一直运行到每次文件偏移结束吗?谢谢!这是有道理的:)