是否可以使用tarfile
从TAR归档中删除某些文件?
例如:
如果一个x.tar
文件包含文件a.txt
,b.txt
和c.txt
,是否可以删除a.txt
?
换句话说:是否存在任何Python解决方案来实现类似于以下命令的操作:
tar -vf x.tar --delete a.txt
?
.tar
中删除它们。tar -vf x.tar --delete a.txt
并不能解决这个问题,因为它并没有从x.tar
中删除a.txt
(x.tar
的大小保持不变),它只是将其从包含文件列表中删除(当解压缩x.tar
时,a.txt
将不会被提取)。.tar
文件是顺序的,因此您可以做的唯一一件事情就是截断它们。因此,唯一的解决方案是从末尾提取文件。with tarfile.open(name=tar_file_path, mode="r") as tar_file:
tar_members = tar_file.getmembers()
然后你可以从末尾提取你想要的文件:
with tarfile.open(name=tar_file_path, mode="r") as tar_file:
tar_file.extractall(path = extracting_dir, members = tar_members[first_of_files_to_extract:])
truncate_size = tar_members[first_of_files_to_extract].offset
new_file_size = truncate_size + 1024 # 2 blocs of 512 Null bytes
最后,您需要进行截断操作,首先是为了删除最后的成员,其次是为了添加空字节(这里不再使用tarfile.open()
打开.tar
文件,截断只是常规的文件操作):
with open(tar_file_path) as tar_file:
tar_file.truncate(truncate_size)
tar_file.truncate(new_file_size)
你从 .tar
文件的末尾提取了文件,并得到了一个新的有效的 .tar
文件,它比之前的文件小了提取文件的大小加上一些块字节大小,并且你限制了额外的内存使用量来适应提取文件的大小:我个人是逐个文件执行此操作的(提取最后一个文件,截断,提取最后一个文件,截断等等)。
直接使用tarfile
是不行的,不过可能有其他库可以实现。一个快速的方法是先解压文件,然后重新创建tar
文件时排除你想要删除的文件。
os.system('tar -vf x.tar --delete a.txt')
- Andrei Cioaraos.system("7za d x.tar a.txt")
请注意,os.system
已被弃用,您应该使用subprocess
。我从未使用过它,所以无法提供更多帮助。