我有一个文件(大小:20 mb |二进制文件)需要每820字节进行一次解析,820的内容保存到一个新文件中,文件名是2byte之间的字符串(ASCII)和16字节标记。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
^ THE FILENAME COMES FROM HERE ^
好的,现在解释了挑战(我希望)我现在拥有的是:
#!/usr/bin/python
with open("file", "rb") as f:
byte = f.read()
if byte > 820:
print "Reach the 1 record mark on the File you have defined "
但我也可以在这里看到一种可能性:
for f.read(820) in file:
a = f.read()
b = open("Iam_from_2_to_16_byte_string", w)
b.write(a)
b.close
我不知道的是如何迭代前820个字节然后接下来的820个字节和下一个820字节,直到文件结束,并且每次我执行新文件时抓取的最难的部分是2到16字节缓冲区,并在我拥有820字节的每个新文件中用作文件名。
答案 0 :(得分:4)
iter()
function可以传递一个函数和一个sentinel,用它来读取820字节块的文件:
for chunk in iter(lambda: f.read(820), ''):
# chunk is now 820 bytes long, until the last chunk which *could* be shorter.
每次迭代,都会调用lambda
函数,读取820字节,直到f.read(820)
返回一个空字符串(表示EOF)。
块只是一个字符串,因此您可以使用切片来获取文件名:
filename = chunk[2:16]
一起使用:
with open("file", "rb") as f:
for chunk in iter(lambda: f.read(820), ''):
open(chunk[2:16], 'wb').write(chunk)
答案 1 :(得分:0)
Python的file
方法read()
有一个选项参数,用于设置要读取的字节数。它还将filepointer保留在读取字节的末尾,以便任何下一个调用将在先前读取的最后一个字节之后开始:
n = 820
with open("file", "rb") as f:
while True:
data = f.read(n)
if not data:
break
# do stuff with data.
# for example, get a filename
filename = str(data[2:16])
以820为步骤迭代文件内容,直到达到EOF。