以下のコードでは、特別な構造を持つ大きなファイルを読み込みます。特に、同時に処理する必要がある2つのブロックがあります。代わりに、前後のファイルを探しているの私はmemoryview
に包まれたこれら二つのブロックをロードmemoryviewでバイナリファイルを読む
with open(abs_path, 'rb') as bsa_file:
# ...
# load the file record block to parse later
file_records_block = memoryview(bsa_file.read(file_records_block_size))
# load the file names block
file_names_block = memoryview(bsa_file.read(total_file_name_length))
# close the file
file_records_index = names_record_index = 0
for folder_record in folder_records:
name_size = struct.unpack_from('B', file_records_block, file_records_index)[0]
# discard null terminator below
folder_path = struct.unpack_from('%ds' % (name_size - 1),
file_records_block, file_records_index + 1)[0]
file_records_index += name_size + 1
for __ in xrange(folder_record.files_count):
file_name_len = 0
for b in file_names_block[names_record_index:]:
if b != '\x00': file_name_len += 1
else: break
file_name = unicode(struct.unpack_from('%ds' % file_name_len,
file_names_block,names_record_index)[0])
names_record_index += file_name_len + 1
呼び出し、ファイルが正しく解析されますが、それはmamoryviewインターフェイスの私の最初の使用だと私は右のそれを行うことを確認していません。 file_names_blockは、ヌルで終わるC文字列で見られるように構成されています。
- 私のトリック
file_names_block[names_record_index:]
はmemoryviewマジックを使用していますか、またはいくつかのn^2スライスを作成しますか?ここでislice
を使用する必要がありますか? - 私が見たように、私はヌルバイトを手動で探し、次に
unpack_from
に進みます。しかし、私はHow to split a byte string into separate bytes in pythonで、メモリビューでcast()
(docs?)を使うことができます。それを使ってバイト単位でビューを分割する方法はありますか?ちょうどsplit('\x00')
に電話できますか?これはメモリ効率を維持するでしょうか?
(python 2の)これを行う正しい方法を理解していただければ幸いです。
ここでは、メモリビューでは何も得られないと思います。 'struct'モジュールのようなメモリビューには、ヌルで終わる文字列のための特別な機能はありません。 –