所以我试图遍历 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()
到内存中的文件空间并将文件作为标准文件对象重新打开,但我会想避免这种情况,因为我需要额外的配置)