Linux下Python的shutil.make_archive生成tar/gztar出现点目录是bug吗?
问题原因与解决方案
核心结论
这不是shutil.make_archive的bug,属于参数使用方式有误,tar与zip格式的底层路径处理逻辑差异导致了两种格式表现不一致。
问题根因
你当前的写法将root_dir直接指定为directoryX目录,shutil.make_archive的默认base_dir参数值为./:
- zip格式打包时会自动过滤无意义的
./路径前缀,所以内容会直接放在归档根目录 - tar系列格式(包括tar、tar.gz)会严格保留写入的路径,
./会被作为实际目录名写入归档,就出现了你遇到的所有内容都存在.文件夹的问题。手动指定base_dir=os.currdir本质还是传了./,所以问题不会解决。
正确写法
方案1:保留外层directoryX目录的写法
如果接受归档内有一层directoryX目录,直接调整参数即可:
import shutil import os shutil.make_archive( 'NameOfArchive', format='gztar', root_dir=os.getcwd(), base_dir='directoryX' )
方案2:内容直接存归档根目录的写法
如果不需要外层directoryX目录,希望所有内容直接放在归档根目录,使用更灵活的tarfile模块实现即可:
import tarfile import os with tarfile.open('NameOfArchive.tar.gz', 'w:gz') as tar: dir_path = os.path.join(os.getcwd(), 'directoryX') for item in os.listdir(dir_path): item_path = os.path.join(dir_path, item) # arcname参数指定文件在归档内的路径,去掉前缀即可 tar.add(item_path, arcname=item)
内容的提问来源于stack exchange,提问作者iTsYaBoiii
相关产品推荐
相关产品推荐

