我有两个二进制I/O流(都继承了BufferedIOBase),它们表示用gzip算法压缩的两个tar档案。你知道吗
有没有什么有效的方法来创造第三个是两个其他的结合?你知道吗
我尝试通过fileobj
参数将两个流转换为^{
def merge_environment(a: Optional[BinaryIO], b: Optional[BinaryIO]) -> Optional[BinaryIO]:
"""Merge <a> and <b>, returning a new tarfile.TarFile object.
If two files in <a> and <b> have the same name, the one in <a> prevails."""
destio = io.BytesIO()
with tarfile.open(fileobj=a, mode="r:gz") as t1, \
tarfile.open(fileobj=b, mode="r:gz") as t2, \
tarfile.open(fileobj=destio, mode="w:gz") as dest:
t1_members = [m for m in t1.getmembers() if m.name != ""]
t1_names = [m.name for m in t1.members]
t2_members = [m for m in t1.getmembers() if m.name != "" and m.name not in t1_names]
for member in t1_members:
dest.addfile(member, t1.extractfile(member))
for member in t2_members:
dest.addfile(member, t2.extractfile(member))
destio.seek(0, 0)
return destio
但是如果任何一个焦油.gz包含目录,因为tarfile.extractfile()
对目录无效。你知道吗
有什么解决办法吗?你知道吗
解决方法非常简单,
fileobj
的参数tarfile.addfile
不是强制的,tarinfo
就足够了:相关问题 更多 >
编程相关推荐