如何在Python中使用压缩创建.tar.gz文件?
我有一个包含FolderB 和FileB 的FolderA。如何创建仅包含FolderB和FileB的tar.gz存档,删除父目录FolderA?我正在使用 Python,并在 Windows 计算机上运行此代码。
我发现的最好的线索是:How to create fullcompressed tar file using Python?
在最受支持的答案中,人们讨论了删除父目录的方法,但它们都不适合我。我尝试过 arcname、os.walk,并通过 subprocess.call () 运行 tar 命令。
我已经接近 os.walk,但在下面的代码中,它仍然会在文件夹 B 和文件 B 中删除一个“_”目录。所以,文件结构是 ARCHIVE.tar.gz > ARCHIVE.tar > “_”目录、FolderB、FileB。
def make_tarfile(output_filename, source_dir):
with tarfile.open(output_filename, "w:gz") as tar:
length = len(source_dir)
for root, dirs, files in os.walk(source_dir):
folder = root[length:] # path without "parent"
for file in files:
tar.add(os.path.join(root, folder), folder)
Run Code Online (Sandbox Code Playgroud)
我使用以下方式制作存档:
make_tarfile('ARCHIVE.tar.gz', 'C:\FolderA')
Run Code Online (Sandbox Code Playgroud)
我应该继续使用 os.walk,还是有其他方法可以解决这个问题?
这是显示我的存档内容的图像。正如您所看到的,我的存档中有一个“_”文件夹,我想删除它——奇怪的是,当我解压时,只有FolderA和FileB.html显示为已存档。从本质上讲,这种行为是正确的,但如果我可以执行最后一步,从存档中删除“_”文件夹,那就完美了。我将提出一个更新的问题以减少混乱。
我的问题是一个跟进这一个。我想知道如何修改以下代码,以便分配压缩级别:
import os
import tarfile
home = '//global//scratch//chamar//parsed_data//batch0'
backup_dir = '//global//scratch//chamar//parsed_data//'
home_dirs = [ name for name in os.listdir(home) if os.path.isdir(os.path.join(home, name)) ]
for directory in home_dirs:
full_dir = os.path.join(home, directory)
tar = tarfile.open(os.path.join(backup_dir, directory+'.tar.gz'), 'w:gz')
tar.add(full_dir, arcname=directory)
tar.close()
Run Code Online (Sandbox Code Playgroud)
基本上,代码的作用是循环遍历目录中的每个目录batch0并压缩每个目录(每个目录中有6000多个文件),并tar.gz为中的每个目录创建一个压缩文件//global//scratch//chamar//parsed_data//。我认为默认情况下,压缩级别为= 9,但压缩需要大量时间。我不需要太多压缩。5级就足够了。如何修改上面的代码以包含压缩级别?