1

我有一个文件(大小:20 mb | 二进制文件),需要每 820 个字节解析一次,并且将 820 的内容保存到一个新文件中,文件名是 2 字节和 16 字节之间的字符串(ASCII)标记。

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 字节,下一个直到文件结尾,并且每次我做那个新文件时,最难的部分是抓取 2 到 16 字节的缓冲区并将其用作我拥有 820 字节的每个新文件中的文件名。

4

2 回答 2

4

iter()函数可以传递一个函数和一个哨兵,使用它来读取 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)
于 2012-11-30T11:16:43.423 回答
0

Python 的file方法read()有一个选项参数,用于设置要读取的字节数。它还将文件指针留在读取的字节末尾,以便任何下一次调用都将在先前读取的最后一个字节之后开始:

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。

于 2012-11-30T11:17:43.630 回答