1

820 バイトごとに解析する必要があるファイル (サイズ: 20 mb | バイナリ ファイル) があり、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])

これは、EOF に達するまで、820 のステップでファイルの内容を反復処理します。

于 2012-11-30T11:17:43.630 に答える