そのため、tar 内の多数のファイルを反復処理し、そのデータを定義済みの ctype 構造にロードしようとしています。tar ファイル以外のファイルでは問題なく動作していましたが、 tarfile のメソッドによって返されたExFileObjectextractfile(member)
がそのメソッドをサポートしていないことがわかりました.readinto(b)
。
だから今ここに私がやっていることがあります:
import os
import tarfile
import io
from ctypes import c_uint, c_char, c_ubyte, c_ushort, BigEndianStructure
class MyStructure(BigEndianStructure):
_pack_ = True
_fields_ = [
("id", c_uint), # 4 bytes
("namefield", c_char * 32), # 32 bytes
("timestamp", c_ubyte * 4), # 4 bytes
("payload_length", c_ushort), # 2 bytes
]
def process_tar(tar_files):
"""
untar and return file objects to be parsed
"""
for filepath in tar_files:
f = os.path.abspath(filepath)
with tarfile.open(f, 'r:*') as tar_f:
#tar_f.fileobject = io.BufferedReader
for tarinfo_member in tar_f.getmembers():
if tarinfo_member.isfile():
yield tar_f.extractfile(tarinfo_member)
f = "somefiles.tar.gz"
for tar_member_fileobj in process_tar([f]):
mystruct = MyStructure()
tar_member_fileobj.readinto(mystruct)
そしてこれを得る:
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-4-257ee4b46c31> in <module>()
29 for tar_member_fileobj in process_tar([f]):
30 mystruct = MyStructure()
---> 31 tar_member_fileobj.readinto(mystruct)
AttributeError: 'ExFileObject' object has no attribute 'readinto'
このメソッドを ExFileObject に追加する方法はありますか? または、定義済みの ctypes 構造にデータを簡単にロードする別の方法はありますか? tarfile
オブジェクトでは、fileobject
返された tarinfo ファイルに使用するように設定できるように見えますが、io.BufferedReader でスワップするだけでは機能しないようです。
(ExFileObjectをStringIOに読み込もうとしましたが、readinto()
適切に実装されていないようです...extractall()
メモリ内のファイルスペースにアクセスして、ファイルを標準ファイルオブジェクトとして再度開くことができると考えていますが、追加の構成が必要になるため、それを避けたい)